描述

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解析

用三指针,fast比slow快n个位置,slowPre是slow的pre节点。

代码

public static ListNode removeNthFromEnd(ListNode head, int n) {
        if (null == head || n <= 0) {
            return head;
        }
        ListNode slowPre = head;//比slow节点慢1个位置
        ListNode slow = head;//比fast节点慢n个位置
        ListNode fast = head;
        int slowCount = 0;
        while (null != fast) {
            if (n > 0) {
                fast = fast.next;
                n--;
                if (n == 0 && null == fast) {//当倒数第n个节点,刚好是首节点,直接返回head.next
                    return head.next;
                }
            } else {
                fast = fast.next;
                slow = slow.next;
                if (slowCount == 1) {
                    slowPre = slowPre.next;
                } else {
                    slowCount++;
                }
            }
        }
        slowPre.next = slow.next;
        return head;
    }

 

posted on 2019-12-19 20:00  反光的小鱼儿  阅读(167)  评论(0编辑  收藏  举报