T19. Remove Nth Node From End of List【Medium】
題目
給定一個鏈表,從鏈表的末尾刪除第n個節點并返回它的頭。
例如,
給出鏈表: 1->2->3->4->5,以及 n = 2.
在移除了倒數第二個節點后, 鏈表變成了 1->2->3->5.
補充:
給出的 n 總是有效地
嘗試把這題一遍過
思路
① 首先建議不明白鏈表的先了解一下鏈表
② 代碼用start保存首節點,用fast和slow結合起來尋找到目標節點位置
③ 因為鏈表不能從后往前移動,也不知道長度,所以先把 fast 前移 n,保持 slow 和 fast 的差值,把 fast 移動到最后(也就是鏈表常用的 fast==null),然后此時 slow 就能容易的定位到倒數第n個數
④ 鏈表常用去節點方式:slow.next = slow.next.next; 下面舉個例子
鏈表 A->B->C 去掉B:A 放開 B 的尾巴,抓住 C 的尾巴
⑤ 具體看代碼以及注釋~
⑥ 有問題歡迎吐槽哈~
代碼
代碼取自 Top Solution,稍作注釋
/**
* 給出的ListNode的結構
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//初始化一個 val=0 的 ListNode ,并賦給 start,slow,fast
ListNode start = new ListNode(0);
ListNode slow = start, fast = start;
//把傳入的鏈表賦給slow.next
slow.next = head;
//把 fast 往前移動 n,使得fast和slow相差n
for(int i=1; i<=n+1; i++) {
fast = fast.next;
}
//把fast移動到最后一個, 保持slow一起移動,相差不變,此時slow就是從后往前n
while(fast != null) {
slow = slow.next;
fast = fast.next;
}
//通過這句代碼跳過中間的節點
slow.next = slow.next.next;
//start用來保存首節點,返回start.next就是首節點
return start.next;
}
}
補充
關于代碼中的,debug了一下,slow 和 fast 的地址和 start 是一樣,所以是傳遞地址的,在后面改了任一一個其他的也會改。
ListNode start = new ListNode(0);
ListNode slow = start, fast = start;
可以看到地址是相同的(哎這個應該是地址吧)~