題目意思: 翻轉(zhuǎn)給定區(qū)間[m,n]的鏈表。 第一個(gè)節(jié)點(diǎn)m=1。 1<=m<=n<=length。
解題思路: 就我目前學(xué)習(xí)到的,有用指向指針的指針的,有插入,有逆轉(zhuǎn)的。但是所有方法的核心,都其實(shí)是一個(gè)算法,就是利用3個(gè)指針修改區(qū)間內(nèi)的節(jié)點(diǎn)的next值,且要保證已修改的鏈表是可以被找到的,即可以連入原鏈表中。 假設(shè)有一個(gè)鏈表有1,2,3,4,5,6,6個(gè)節(jié)點(diǎn)。m=2,n=5。 我們添加一個(gè)dummy節(jié)點(diǎn),方便操作第一個(gè)節(jié)點(diǎn)。
首先讓pre指向第m個(gè)節(jié)點(diǎn)前面那個(gè),cur指向第m個(gè)節(jié)點(diǎn),p1指向m的下一個(gè)節(jié)點(diǎn),因?yàn)閜1有可能是NULL,所以當(dāng)p1不是NULL的時(shí)候,p2指向p1的下一個(gè)節(jié)點(diǎn)。 上圖畫(huà)出了這幾個(gè)指針指向情況的開(kāi)始狀態(tài)和我們希望的終止?fàn)顟B(tài)。 在最終狀態(tài)下,再通過(guò)其中方框中的兩步就可以我們需要的鏈表了。
而cur,p1,p2三個(gè)指針在區(qū)間內(nèi)向前移動(dòng)并且將p1的next指向cur的過(guò)程則包含在一個(gè)for循環(huán)內(nèi)部。如下:
代碼如下: 1 class Solution { 2 public: 3 ListNode *reverseBetween(ListNode *head, int m, int n) { 4 ListNode *dummy = new ListNode(0); 5 dummy->next = head; 6 7 ListNode *pre = dummy, *cur = head; 8 for(int i = 1; i < m; i++){ 9 pre = cur; 10 cur = cur->next; 11 } 12 13 ListNode *p1,*p2; 14 if(cur) 15 p1 = cur->next; 16 if(p1) 17 p2 = p1->next; 18 for(int j = m; j < n; j++){ 19 p1->next = cur; 20 cur = p1; 21 p1 = p2; 22 if(p2) p2 = p2->next; 23 } 24 pre->next->next = p1; 25 pre->next = cur; 26 27 return dummy->next; 28 } 29 };
分類: Leetcode 解題 |
|
|
來(lái)自: 雪柳花明 > 《LeetCode》