LeetCode Notes_#92 Reverse Linked List II(C++,Python)
LeetCode Notes_#92 Reverse Linked List II(C++,Python)
LeetCodeContents
題目
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)先將指標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++
- class Solution {
- public:
- ListNode* reverseBetween(ListNode* head, int m, int n) {
- int change_len = n-m+1;
- ListNode * new_head = NULL;
- ListNode* result = head;
- ListNode* pre_head = NULL;
- ListNode* modify_list_tail = NULL;
- for(int i=1;i<m;i++){
- pre_head = head;//儲存逆置段的前驅
- head=head->next;//將head移動到m節點
- }
- modify_list_tail = head;
- while(change_len&&head){//將逆置段逆置
- ListNode* next = head->next;
- head->next = new_head;
- new_head = head;
- head = next;//最後一次迴圈,head就是逆置段的後置
- change_len--;
- }
- modify_list_tail->next = head;
- if (pre_head){
- pre_head->next = new_head;
- }
- else{
- result = new_head;
- }
- return result;
- }
- };
4ms,C++的確比較快
一個困惑的點:
問題:16行,new_head是NULL,那麼是不是最後的結果會在逆置段和逆置後繼之間有一個NULL?
回答:不會,因為22行連線逆置段後繼的時候,直接將NULL修改為逆置段後繼了
自己編寫測試用例,在VS Studio裡除錯
- using namespace std;
- struct ListNode {
- int val;
- ListNode *next;
- ListNode(int x) : val(x), next(NULL) {}
- };
- class Solution {
- public:
- ListNode* reverseBetween(ListNode* head, int m, int n) {
- int change_len = n - m + 1;
- ListNode * new_head = NULL;
- ListNode* result = head;
- ListNode* pre_head = NULL;
- ListNode* modify_list_tail = NULL;
- for (int i = 1; i<m; i++) {
- pre_head = head;//儲存逆置段的前驅
- head = head->next;//將head移動到m節點
- }
- modify_list_tail = head;
- while (change_len&&head) {//將逆置段逆置
- ListNode* next = head->next;
- head->next = new_head;
- new_head = head;
- head = next;//最後一次迴圈,head就是逆置段的後置
- change_len--;
- }
- modify_list_tail->next = head;
- if (pre_head) {
- pre_head->next = new_head;
- }
- else {
- result = new_head;
- }
- return result;
- }
- };
- void main() {
- ListNode a(1);
- ListNode b(2);
- ListNode c(3);
- ListNode d(4);
- ListNode e(5);
- a.next = &b;
- b.next = &c;
- c.next = &d;
- d.next = &e;
- Solution solve;
- ListNode *head = solve.reverseBetween(&a, 2, 4);
- while (head) {
- printf("%d\n", head->val);
- head = head->next;
相關推薦
LeetCode Notes_#92 Reverse Linked List II(C++,Python)
LeetCode Notes_#92 Reverse Linked List II(C++,Python) LeetCode Contents 題目 思路和解答 思路
【LeetCode】92. Reverse Linked List II(C++)
地址: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 II(python+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 List(C++,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 II(c++版)
題目連結: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 II(c++版)
題目大意:與之前的跳躍遊戲一樣,從下標0出發,檢視是否能跳躍到陣列的最後一個下標。陣列的每個元素都是能跳躍的距離,現在要求輸出跳躍到最後下標的最小步數。 注意點: 這次要求所給的陣列都能到達最後下標,即無需考慮到達不了的情況 不一定每次都走最大的距離,才能最
【leetcode】92.(Medium)Reverse Linked List II
解題思路: 這道題的意思是,有一串連結串列,將第m位到第n位翻轉過來,比如對於連結串列1-2-3-4-5,翻轉第2到第4位後就是1-4-3-2-5 題目要求只遍歷一遍連結串列 我的想法是將翻轉的部分用棧存起來,然後重新新建結點 general的做法是直接修改原連結串列的結點指向關係,比如