174. 删除链表中倒数第n个节点

描述

给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。

注意事项

链表中的节点个数大于等于n

样例

给出链表1->2->3->4->5->null和 n = 2.
删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.

挑战

O(n)时间复杂度

代码

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */


public class Solution {
    /*
     * @param head: The first node of linked list.
     * @param n: An integer
     * @return: The head of linked list.
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if (n <= 0) {
            return null;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        ListNode preDelete = dummy;
        // head 从第一个结点往后走了 n 步,走到第 n+1 个结点
        for (int i = 0; i < n; i++) {
            if (head == null) {
                return null;
            }
            head = head.next;
        }
        // head 指针从第一个结点开始走 n+k 步到达结点末尾的空指针
        // 此时第一个指针在第 n+1 个结点,往后走 k 步到达空指针
        // 第二根指针从第 0 个结点(dummy结点)走 k 步到达目标结点的上一个结点
        // (链表倒数第 n+1 个结点),在此结点如果继续往后走 n+1 步正好到空结点,总共 k + n + 1 步
        while (head != null) {
            head = head.next;
            preDelete = preDelete.next;
        }
        
        // 删除倒数第 n 个结点
        preDelete.next = preDelete.next.next;
        return dummy.next;
    }
}

你可能感兴趣的:(174. 删除链表中倒数第n个节点)