1. 程式人生 > >92. Reverse Linked List II(python+cpp)

92. Reverse Linked List II(python+cpp)

題目:

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;   
    }
};

總結: 原地單鏈表翻轉的寫法要爛熟於心。