美文网首页
174. 删除链表中倒数第n个节点

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

作者: 6默默Welsh | 来源:发表于2018-02-05 18:33 被阅读65次

    描述

    给定一个链表,删除链表中倒数第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;
            }
            // 此时第一个指针在第 n+1 个结点,往后走 k 步到达空指针
            // 第二根指针从第 0 个结点(dummy结点)走 k 步到达目标结点的上一个结点
            // (链表倒数第 n+1 个结点),在此结点如果继续往后走 n+1 步正好到空结点
            while (head != null) {
                head = head.next;
                preDelete = preDelete.next;
            }
            
            // 删除倒数第 n 个结点
            preDelete.next = preDelete.next.next;
            return dummy.next;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:174. 删除链表中倒数第n个节点

          本文链接:https://www.haomeiwen.com/subject/ccmvaxtx.html