一、題目
網址:反轉鏈表II。
難度:中等。
反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。
說明:
1 ≤ m ≤ n ≤ 鏈表長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
二、程序
思路:需要記錄要反轉鏈表的前驅和後驅,中間鏈表反轉,之後再改變前驅和反轉後最後節點的指針。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int len=n-m+1; //需要反轉鏈表節點的個數
ListNode* result=head;
//找到m的前驅節點,並存儲下來
ListNode* pre_head=NULL;
while(head && --m) //這裏只能--m,因爲鏈表的節點從1開始
{
pre_head=head;
head=head->next;
}
//開始對m到n之間的鏈表進行反轉
ListNode* last_head=head; //反轉後的第n個結點,即爲反轉前的第m個節點
ListNode* new_head=NULL;
while(head&&len--)
{
ListNode* next=head->next;
head->next=new_head;
new_head=head;
head=next;
}
last_head->next=head;
if(pre_head)
{
pre_head->next=new_head;
}
else
{
result=new_head;
}
return result;
}
};
結果: