Remove Nth Node From End of List
阿新 • • 發佈:2018-11-09
solution delet 解決 head == null 節點 使用 rem
題目描述:
給定一個鏈表,刪除鏈表的倒數第n個節點,並返回頭結點
即給定 1->2->3->4->5 ,n=2
得到 1->2->3->5
解題思路1:
獲取鏈表的總長度
len
,拿到要刪除節點的前一個節點len-n-1
,刪除要刪除的節點,並返回頭節點
參考代碼:
public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; } } public static ListNode solution1(ListNode head, int n) { if (head == null) { return null; } //創建一個臨時頭部 ListNode tempHead = new ListNode(0); tempHead.next = head; //計算鏈表長度 int len = 0; ListNode next = head; while (next != null) { len++; next = next.next; } //獲取要刪除元素的前一個節點 ListNode p = tempHead; for (int i = 0; i < len - n; i++) { p = p.next; } //刪除要刪除的元素 ListNode deleteNode = p.next; p.next = deleteNode.next; deleteNode.next = null; //獲得新鏈表的頭節點 ListNode newHead = tempHead.next; tempHead.next = null; return newHead; }
這裏使用了臨時頭部解決了當需要刪除的元素是鏈表頭部需要進行特殊處理的情況
這種解法需要掃描鏈表兩次,第一次獲取鏈表長度,第二次定位要刪除的節點,效率不是很高.
解題思路2
定義兩個指針,一個快,一個慢,快的先走n+1步,然後慢的開始走,當快的走到頭的時候,慢的也走到了要刪除節點的前一個節點
參考代碼:
public static ListNode solution2(ListNode head, int n) { if (head == null) { return null; } ListNode tempHead = new ListNode(0); tempHead.next = head; ListNode fast = tempHead; ListNode slow = tempHead; //快的先走n+1步 for (int i = 0; i < n + 1; i++) { fast = fast.next; } //然後兩個一起走 while (fast != null) { fast = fast.next; slow = slow.next; } //刪除指定節點 ListNode deleteNode = slow.next; slow.next = deleteNode.next; deleteNode.next = null; //取出頭節點,並把臨時頭節點鏈接中斷 ListNode ret = tempHead.next; tempHead.next = null; return ret; }
Remove Nth Node From End of List