题目:
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.
/**
* 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 dummy(-1);
dummy.next=head;
ListNode* prev=&dummy;
for(int i=1;i<m;++i)
prev=prev->next;
ListNode* head2=prev;
prev=head2->next;
ListNode* cur=prev->next;
for(int i=m;i<n;++i){
prev->next=cur->next;
cur->next=head2->next;
head2->next=cur;
cur=prev->next;
}
return dummy.next;
}
};
* 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 dummy(-1);
dummy.next=head;
ListNode* prev=&dummy;
for(int i=1;i<m;++i)
prev=prev->next;
ListNode* head2=prev;
prev=head2->next;
ListNode* cur=prev->next;
for(int i=m;i<n;++i){
prev->next=cur->next;
cur->next=head2->next;
head2->next=cur;
cur=prev->next;
}
return dummy.next;
}
};
该题目的思路就是m到n之间进行一步步的交换
做的时候出现的问题有很多,原因在于自己对于链表的认识还很模糊
问题1. 在代码最后 return head ,正确应该是return dummy.next
当链表只有两个元素时,head指向第一个元素,当交换后,如果return head,则只返回交换后的后面一个元素
如{3,5},交换后为{5,3},则只返回 3
在只有两个元素时 dummy等同于head2了,在超过两个元素时,head2是m的前一个元素
,这种想法是不对的,head2应该说是一个辅助结点,并不等同于dummy,
是自己新声明的一个,其next为prev的结点,返回链表则要返回dummy.next.. 真正等同于是prev=&dummy的引用符的使用
问题2.
在写交换四连的时候出错了
对于这交换四式,prev->next=cur->next好理解,最后两步也没毛病
但在第二步我写成了 cur->next=prev就报错了,正确写法是cur->next=head->next
这是因为一开始我想当然认为是通过相邻元素的交换实现一段的交换,通过在笔上认真演示后才发现不是
总而言之,链表稍不注意就会出错,还需努力