問題描述
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思想
- 第一種使用兩次遍歷,第一次確定長度,這樣我們才能確定倒數第n個節點在哪裏。
- 第二種解法就是利用兩個指針指着,但是我們要增加節點,再最後面增加一個節點,在最前面也要增加一個節點,然後後面的指針永遠比前面的指針大n-1位,這樣當到達節點的尾部的時候,前面的指針就指着倒數第n-1個,這個時候利用第n-1個刪除第n個就可以了。
測試用例
因爲是有效的輸入,所以不考慮n無效的情況。(例如小於等於0,n大於長度)
1->10->5 n=2
1 n=1
1->10->20 n=3
代碼
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//後面的指針
ListNode second=new ListNode(0);
second.next=head;
//前面的指針
ListNode first=second;
//有一個指針來記錄根節點
ListNode root=second;
//first要先走n+1步
for(int i=0;i<=n;i++){
first=first.next;
}
//!=next等於在後面增加一個null節點
while(first!=null){
first=first.next;
second=second.next;
}
second.next=second.next.next;
return root.next;
}
}
總結
這次的代碼化了好長時間,因爲對於鏈表的理解不夠徹底。
當鏈表的表示爲first!=null的時候,其實就是默認給鏈表在尾部增加了一個空節點。