LeedCode--【19】--【刪除連結串列的倒數第 n 個節點】
阿新 • • 發佈:2018-11-17
一、原題要求:
給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。
示例:
給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
思路:
使用兩個指標,第一個指標先向前移動 n步,此時,同時移動兩個指標向前移動,一次一個節點;直到第一個指標到達最後一個結點。此時第二個指標的下一個節點就是倒數第n個節點。重新連結第二個指標所指向的結點就可以了;即:next 指標指向該結點的下下個結點。
二、程式碼實現
1、Solution .java
public class Solution { /** * <pre> *給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 * * 示例: * * 給定一個連結串列: 1->2->3->4->5, 和 n = 2. * * 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5. * 說明: * * 給定的 n 保證是有效的。 * * * 解題思路 * 先讓一個指標走找到第N個節點,然後再讓一個指標指向頭結點,然後兩具指標一起走, * 直到前一個指標直到了末尾,後一個指標就是倒數第N+1個結點,刪除倒數第N個結點就可以了。 * </pre> * * @param head * @param n * @return */ public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null && head.next == null){ return null; } ListNode pre = new ListNode(0); // 建立一個臨時指標 pre.next = head; ListNode slow = pre; // 慢指標 ListNode fast = pre; // 快指標 for(int i = 0; i < n; i++){ // 快指標先走n步,找到第n個結點 fast = fast.next; } while(fast.next != null){ // 一起走 fast = fast.next; slow = slow.next; } slow.next = slow.next.next; return pre.next; } }
2、Main .java
public class Main { public static void main(String[] args) { ListNode n1 = new ListNode(1); ListNode n2 = new ListNode(2); ListNode n3 = new ListNode(3); ListNode n4 = new ListNode(4); ListNode n5 = new ListNode(5); n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; System.out.print("初始連結串列:"); print(n1); Solution solution = new Solution(); ListNode head = solution.removeNthFromEnd(n1, 2); System.out.print("最終連結串列:"); print(head); } private static void print(ListNode head) { for (ListNode temp = head; temp != null; temp = temp.next){ System.out.print(temp.val + "->"); } System.out.println("null"); } }
2、ListNode .java
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}