反轉從位置 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...