反轉(zhuǎn)從位置 m 到 n 的鏈表库糠。請(qǐng)使用一趟掃描完成反轉(zhuǎn)。
說明:
1 ≤ m ≤ n ≤ 鏈表長(zhǎng)度。
1 瞬欧, 2贷屎, 3, 4 艘虎, 5 m=2,n=4
p tail item
1 唉侄, 3 , 2 野建, 4 属划, 5
p tail item
1 , 4, 3 , 2 ,5
p tail
先找到第m節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)用p來表示 ,在找到第m節(jié)點(diǎn)用tail來表示,在找到第m節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)用item來表示候生,每次把item節(jié)點(diǎn)也就是tail的next節(jié)點(diǎn)移動(dòng)到p節(jié)點(diǎn)的后面同眯,一直循環(huán)就可以來,永遠(yuǎn)不改變tail唯鸭,一直往后頂须蜗。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
struct ListNode {
int val;
struct ListNode * next;
};
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
struct ListNode h = {0,head};
struct ListNode * p = &h;
struct ListNode * tail;
if(m==n){
return head;
}
for(int i=1;i<=n;i++){
if(i<m){
p= p ->next;
}else if(i==m){
tail = p->next;
}else{
struct ListNode * item = tail->next;
// 1 2 3 4 5
tail->next = tail->next->next;
item->next = p->next;
p->next = item;
}
}
return h.next;
}