1. 程式人生 > >LeetCode Notes_#92 Reverse Linked List II(C++,Python)

LeetCode Notes_#92 Reverse Linked List II(C++,Python)

LeetCode Notes_#92 Reverse Linked List II(C++,Python)

LeetCode 

Contents

題目

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

思路和解答

思路

  1. 幾個關鍵節點

關鍵節點
關鍵節點

  1. 整體思路

圖解
圖解

圖解
圖解

(1)先將指標head移動到開始逆置的節點modify_list_tail
(2) 按照之前#206 Reverse Linked List的做法,將[m,n]這一段逆置
(3)將被逆置的一段和逆置段前驅,逆置段後繼連線起來
(4)考慮特殊情況:m=1?
如果是從第一個節點開始逆置,那麼最後就不需要連線pre_head了

(5)為什麼逆置的最後一個節點不需要考慮?

  • 因為n<=length,之後無論如何還有一個NULL節點,最後還是要把連結串列和NULL接起來

3.思考:返回結果是什麼?

  • 返回的結果的形式是指向連結串列第一個節點的頭指標
  • 如果m!=1,結果是一開始的head,要提前儲存;如果m=1,結果是new_head

解答

C++

  1. class Solution { 
  2. public
  3. ListNode* reverseBetween(ListNode* head, int m, int n)
  4. int change_len = n-m+1
  5. ListNode * new_head = NULL
  6. ListNode* result = head; 
  7. ListNode* pre_head = NULL
  8. ListNode* modify_list_tail = NULL
  9. for(int i=1;i<m;i++){ 
  10. pre_head = head;//儲存逆置段的前驅 
  11. head=head->next;//將head移動到m節點  
  12. modify_list_tail = head; 
  13. while(change_len&&head){//將逆置段逆置 
  14. ListNode* next = head->next; 
  15. head->next = new_head; 
  16. new_head = head; 
  17. head = next;//最後一次迴圈,head就是逆置段的後置 
  18. change_len--; 
  19.  
  20. modify_list_tail->next = head; 
  21. if (pre_head){ 
  22. pre_head->next = new_head; 
  23. else
  24. result = new_head; 
  25. return result; 
  26. }; 

4ms,C++的確比較快

一個困惑的點:
問題:16行,new_head是NULL,那麼是不是最後的結果會在逆置段和逆置後繼之間有一個NULL?
回答:不會,因為22行連線逆置段後繼的時候,直接將NULL修改為逆置段後繼了

自己編寫測試用例,在VS Studio裡除錯

  1. #include <iostream> 
  2. using namespace std
  3. struct ListNode { 
  4. int val; 
  5. ListNode *next; 
  6. ListNode(int x) : val(x), next(NULL) {} 
  7. }; 
  8. class Solution { 
  9. public
  10. ListNode* reverseBetween(ListNode* head, int m, int n)
  11. int change_len = n - m + 1
  12. ListNode * new_head = NULL
  13. ListNode* result = head; 
  14. ListNode* pre_head = NULL
  15. ListNode* modify_list_tail = NULL
  16. for (int i = 1; i<m; i++) { 
  17. pre_head = head;//儲存逆置段的前驅 
  18. head = head->next;//將head移動到m節點  
  19. modify_list_tail = head; 
  20. while (change_len&&head) {//將逆置段逆置 
  21. ListNode* next = head->next; 
  22. head->next = new_head; 
  23. new_head = head; 
  24. head = next;//最後一次迴圈,head就是逆置段的後置 
  25. change_len--; 
  26.  
  27. modify_list_tail->next = head; 
  28. if (pre_head) { 
  29. pre_head->next = new_head; 
  30. else
  31. result = new_head; 
  32. return result; 
  33. }; 
  34.  
  35. void main()
  36. ListNode a(1)
  37. ListNode b(2)
  38. ListNode c(3);  
  39. ListNode d(4);  
  40. ListNode e(5)
  41. a.next = &b; 
  42. b.next = &c; 
  43. c.next = &d; 
  44. d.next = &e; 
  45. Solution solve; 
  46. ListNode *head = solve.reverseBetween(&a, 2, 4); 
  47. while (head) { 
  48. printf("%d\n", head->val); 
  49. head = head->next; 

    相關推薦

    LeetCode Notes_#92 Reverse Linked List IIC++,Python

    LeetCode Notes_#92 Reverse Linked List II(C++,Python) LeetCode  Contents 題目 思路和解答 思路

    LeetCode92. Reverse Linked List IIC++

    地址:https://leetcode.com/problems/reverse-linked-list-ii/ 題目: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n

    LeetCode-92. Reverse Linked List II附思考過程和debug過程

    https://leetcode.com/problems/reverse-linked-list-ii/題意比較簡單,要求在一輪遍歷中將第m個節點到第n個節點逆轉,其他節點保持不變,核心程式碼與https://leetcode.com/problems/reverse-linked-list/有所

    92. Reverse Linked List IIpython+cpp

    題目: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list.

    [LeetCode] 92. Reverse Linked List II Java

    nbsp con pre -s efi 題意 star 時有 in-place 題目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given

    Leetcode 92. Reverse Linked List II

    logs sta urn -a 添加 http problems nbsp return 思路:添加頭節點,反轉鏈表某個連續部分,206. Reverse Linked List是本題的特殊情況,也可以像本題一樣做,具體見Leetcode 206. Reverse Lin

    [Leetcode] 92. Reverse Linked List II

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {}

    Leetcode 92. Reverse Linked List II 翻轉部分連結串列

    解決思路: 注意的要點是:m 可能位於頭結點,所以這裡臨時建立一個節點,每次將cur後面的節點放到pre節點後邊,這裡的cur->next 其實是在一直變化的,所以這裡cur並不用自己更新,每次進行重連結時相當於對連結串列進行了遍歷。 /** * Def

    leetcode.92. Reverse Linked List II

    /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * };1. 。*/struct ListNode* reverseBetween(struct Lis

    LeetCode Notes_#206 Reverse Linked ListC++,Python

    LeetCode Notes_#206 Reverse Linked List(C++,Python) LeetCode Linked List  Contents 題目 思路

    [Leetcode]#92 Reverse Linked List II

    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

    LeetCode-92-Reverse Linked List II

    reverse posit 思路 span pan next between return position 算法描述: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤

    92. Reverse Linked List II【Medium】

    gin ply com medium ext prev spa pass using 92. Reverse Linked List II【Medium】 Reverse a linked list from position m to n. Do it in-place

    92. Reverse Linked List II

    link 通過 AR start fin rev diff between pass 問題描述: Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length

    leetcode206. Reverse Linked List/92. Reverse Linked List II

    題目描述 反轉單鏈表 例子 Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NUL

    92. Reverse Linked List II - Medium

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Example: Input:

    92. Reverse Linked List II【遍歷一遍就反轉連結串列】

    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

    Leetcode題解系列——264. Ugly Number IIc++版

    題目連結:264. Ugly Number II 題目大意:輸出第n個順序的醜數,醜數的定義為一個數的質因子只能是2,3,5. 例子: 6是醜數,6 = 2 * 3 8是醜數,8 = 2 * 2 * 2 14不是醜數, 14 = 7 * 2. 包含了7

    Leetcode題解系列——45. Jump Game IIc++版

    題目大意:與之前的跳躍遊戲一樣,從下標0出發,檢視是否能跳躍到陣列的最後一個下標。陣列的每個元素都是能跳躍的距離,現在要求輸出跳躍到最後下標的最小步數。 注意點: 這次要求所給的陣列都能到達最後下標,即無需考慮到達不了的情況 不一定每次都走最大的距離,才能最

    leetcode92.MediumReverse Linked List II

    解題思路: 這道題的意思是,有一串連結串列,將第m位到第n位翻轉過來,比如對於連結串列1-2-3-4-5,翻轉第2到第4位後就是1-4-3-2-5 題目要求只遍歷一遍連結串列 我的想法是將翻轉的部分用棧存起來,然後重新新建結點 general的做法是直接修改原連結串列的結點指向關係,比如