Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
题目意思是逆置指定链表的第m位到第n位。
并不难只是复杂一点。1,想法是记录第m和m的前驱节点mPre,记录第n和n的后继节点nNext,维护三个指针pre,cur,next。
2,然后将m的前驱节点mPre指向第n节点,m节点指向n的后继节点nNext。
3,考虑一种边界情况,当m=1的时候,即mPre=NULL的时候,这时新链表的头结点就是第n节点。
/**
* 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) {
ListNode* cur=head;
ListNode* pre=NULL;
listNode* Next;
ListNode* mNode;
ListNode* mPre;
ListNode* nNode;
ListNode* nNext;
int i=1;
while(i<=n){ //从第一个节点开始遍历,依次纪录要记下的节点。
Next=cur->next;
if(i==m){
mPre=pre;
mNode=cur;
}
if(i==n){
nNode=cur;
nNext=Next;
}
if(i>m)cur->next=pre;//当m<i<=n时,逆置链表指定位置。
pre=cur;
cur=Next;
i++
}
ListNode* newNode;
if(mPre==NULL)newNode=nNode;//当m节点前驱为NULL时,即当m=1时。
else {
mPre->nNode;
newNode=head;
}
mNode->next=nNext;
return newNode;
}
};
Submission Details
44 / 44 test cases passed.
Status:
Accepted
Runtime: 4 ms
Submitted: 38 minutes ago