Reverse linked list(逆轉從n到m處的單鏈表)--leetcode
阿新 • • 發佈:2019-01-01
題目描述:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
解題思路:
找到第m個結點,並記錄其前繼結點,然後依次從m+1開始到n,逆轉後續結點,注意在最後的時候,修改原先第m處的連結串列的next指標。
程式碼如下:
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (!head || m < 1 || m == n) return head;
//前m-1個連結串列
ListNode *q = NULL; //用q儲存第m-1個結點
ListNode *p = head; //讓p指向第m個結點
int count = 1;
while(count < m && p){
q = p;
p = p->next;
++count ;
}
//逆轉m到n個結點
ListNode *end = p;//始終指向逆轉前的第m個結點
ListNode *pre = p;//可以看為逆置連結串列的頭結點
ListNode *pNext = NULL;//指向p的下一個結點
p = p->next;//(指向m+1處的結點)
for (count = m+1; count <= n; ++count){
pNext = p -> next;//儲存下一個結點資訊
p -> next = pre;//頭插法
pre = p;//前移pre
p = pNext;//回到初始連結串列的下一個結點
}
/* 結束的時候,end指向逆轉前的第m個結點(逆轉後,為逆轉連結串列的最後一個結點),
pre指向指向逆轉後第m個結點(逆轉前的第n個結點), p指向原連結串列的n+1個結點
*/
//連結逆轉連結串列和後面的連結串列
end -> next = p;//這一步,修正了原連結串列第m個結點後項指標
//如果第m-1個結點為空的話,表示,從head開始逆轉
if (q){//不為空,將前m-1個連結串列和逆轉後的連結串列連結
q -> next = pre;
}else{//為空,逆轉連結串列的頭結點,就是要求的連結串列
head = pre;
}
return head;
}
};
配圖分析: