刪除連結串列中的倒數第n個節點
阿新 • • 發佈:2018-12-22
給定一個連結串列,刪除連結串列的倒數第n個節點,並且返回連結串列的頭結點。
示例:
給定一個連結串列: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
題目分析:
一、設快慢指標slow和fast,讓fast先走n-1步,然後再同時後移快慢指標,當快指標移到連結串列末尾的時候,慢指標所指向的節點就是要刪除的節點;
二、但要是刪除連結串列的最後一個元素,即n=1的時候,快慢指標方法就會出現問題,因為fast開始不移動,和慢指標一起後移到最後一個節點的時候要刪除最後一個節點,在刪除最後一個節點的時候,刪除操作會出現空指標報錯,所以行不通;
所以當要刪除最後一個節點的時候就是最簡單的遍歷連結串列刪除,讓fast指標先走一步,然後一起移動,再進行刪除操作。
程式碼實現:
public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode removeNthFromEnd(ListNode head, int n) { if (n == 1) //如果是刪除最後一個節點,就遍歷刪除 { if (head == null || head.
next == null) return null; ListNode Pre = head; ListNode temp = head.next; while (temp.next != null) { temp = temp.next; Pre = Pre.next; } Pre.next = null; return head; } int k = n - 1; ListNode slow = head; ListNode fast =head; for (int i = 0; i < k; i++) { fast = fast.next; } while (fast.next != null) { fast = fast.next; slow = slow.next; } slow.val = slow.next.val; slow.next = slow.next.next; return head; }
主函式:
public static void main(String[] args) { L8 l = new L8(); ListNode node = new ListNode(1); node.next = new ListNode(2); node.next.next = new ListNode(3); node.next.next.next = new ListNode(4); ListNode res = l.removeNthFromEnd(node,2); while (res != null) { System.out.print(res.val + " "); res = res.next; } }
執行結果:
1 2 4