鍊錶的反轉II

2021-10-02 06:57:27 字數 1135 閱讀 1937

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。

說明:1 ≤ m ≤ n ≤ 鍊錶長度。

示例:輸入: 1->2->3->4->5->null, m = 2, n = 4

輸出: 1->4->3->2->5->null

首先我們先分析題目,這道題類似於鍊錶的反轉,只不過設定了反轉的範圍,所以解題思路乙個是我認為難點在於:

鍊錶的反轉

特殊情況的處理(比如m=1)

鍊錶的連線

首先我們先來分析第乙個問題,這裡涉及到單鏈表的反轉,參考一篇文章:link

自己總結如下:

第一種方法:

設定乙個頭節點 start並初始化為null,然後從原鍊錶的頭部乙個乙個取節點並插入到新鍊錶的頭部,具體**如下:

listnode* change(listnode* head)

return newh;

}

第二種方法:

每次都將原第乙個結點之後的那個結點放在新的表頭後面

listnode* reverselist(listnode* head) 

return res->next;

}

對於第二個難點,特殊情況的處理:

當m==n時,證明沒有要反轉的鍊錶,直接返回

當m=1時,會出現的問題是:我們會直接跳過頭節點(因為使用了node=node->next),所以我們設定乙個啞節點(這個思想是從分割鍊錶中得到的),然後設定啞節點的next指向頭節點

對於鍊錶的連線,主要在於:前面的鍊錶和反轉鍊錶的連線,反轉鍊錶和後面未反轉的鍊錶的連線

所以具體整個**如下:

class solution 

first=end = node->next; //假設不設定啞節點,則會直接跳過頭節點

i = 0;

//進行鍊錶的反轉,用的是第一種方法

while (i <= n - m)

end->next = temp; //這裡連線的是反轉鍊錶和後面未反轉鍊錶的連線

node->next = head;

return emp.next;

}};

反轉鍊錶 II

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 思路就是用頭插法進行反轉 裡注釋說得差不多了 definition for singly linked list.stru...

92 反轉鍊錶 II

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 null definition for singly linked list.struct listnode class soluti...

LeetCode反轉鍊錶II

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 把鍊錶分為三部分,中間一部分當做反轉鍊錶i的方法 class solution listnode node pre lis...