12.算法学习之删除链表的倒数第N个节点

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

示例

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

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

说明:给定的 n 保证是有效的。

我的思路: 首先看到这类型的题,首先肯定想到的是快慢指针, 而不是用一个额外的集合去存储链表节点,然后删除倒数第N个节点。 利用快慢指针,我们同时还得新增一个 哨兵节点,指向头结点,目的是有利于头结点的删除。我的代码如下:

public static ListNode removeNthFromEnd(ListNode head, int n) {
        //哨兵节点
        ListNode sb = new ListNode();
        sb.next = head;
        //k快指针,m慢指针
        ListNode k = sb, m = sb;
        int count = 0;
        while (k.next != null) {
            k = k.next;
            //快指针先走N步
            if (++count > n) {
                m = m.next;
            }
        }
        m.next = m.next.next;
        return sb.next;
    }

以上就是我的代码了。这类题型应该选用这类双指针的技巧。

还有的思路是利用栈Stack来做,也是可以的,不过比双指针要劣势一点。

public static ListNode removeNthFromEnd2(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        Stack<ListNode> stack = new Stack<>();
        ListNode cur = dummy;
        //先入栈
        while (cur != null) {
            stack.push(cur);
            cur = cur.next;
        }
        //出栈后N个节点
        for (int i = 0; i < n; i++) {
            stack.pop();
        }
        //获取到倒数第N+1个node
        ListNode node = stack.peek();
        node.next = node.next.next;
        return dummy.next;
    }

如有错误,请各位大佬指出! 谢谢。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注