题目:
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL
解释:
给定范围内的单链表翻转。
python代码:
class Solution:
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if not head or m==n:
return head
#如果用None的话,若pre==None,那么pre没有next
dummyNode=ListNode(0)
dummyNode.next=head
pre=dummyNode
for i in range(m-1):
pre=pre.next
#reverse the [m,n] nodes,n-m+1 nodes
#pre保存的是第一部分的最后一个结点
#搞成我的经典写法
reverse_head=pre.next
reverse_pre=None
cur=reverse_head
for i in range(n-m+1):
then=cur.next
cur.next=reverse_pre
reverse_pre=cur
cur=then
#1->2<-3<-4 5
#把两头接上
#指实例中的结点2
#接上后半段
#1->4->3->2->5
pre.next.next=cur
#接上前半段
pre.next=reverse_pre
return dummyNode.next
c++代码:
/**
* 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) {
if(!head ||m==n)
return head;
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode* pre=dummyHead;
for(int i=0;i<m-1;i++)
pre=pre->next;
ListNode* reverse_head=pre->next;
ListNode* reverse_pre=NULL;
ListNode* cur=reverse_head;
for (int i=0;i<n-m+1;i++)
{
ListNode* then=cur->next;
cur->next=reverse_pre;
reverse_pre=cur;
cur=then;
}
pre->next->next=cur;
pre->next=reverse_pre;
return dummyHead->next;
}
};
总结:
原地单链表翻转的写法要烂熟于心。