leetcode题目19.删除链表的倒数第N个节点(中等)

题目描述:

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

示例:

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

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

给定的 n 保证是有效的。

进阶:

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

题目解析:

我们可以设想假设设定了双指针pq的话,当q指向末尾的NULLpq之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成了要求。

  • 设置虚拟节点dummyHead指向head
  • 设定双指针pq,初始都指向虚拟节点dummyHead
  • 移动q,直到pq之间相隔的元素个数为n
  • 同时移动pq,直到q指向的为NULL
  • p的下一个节点指向下下个节点

代码实现:

public ListNode removeNthFromEnd(ListNode head, int n) {
    
        if (head == null || n < 0) {
            return null;
        }

        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;

        //定义p、q指针
        ListNode p = dummyHead;
        ListNode q = dummyHead;

        for (int i = 0; i <= n; i++) {
            q = q.next;
        }
        while (q != null) {
            q = q.next;
            p = p.next;
        }
        //将p指向的结点下一个结点,更改为p上一个结点的下一个结点,删除p指向的结点
        p.next = p.next.next;
        return dummyHead.next;
    }

时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次遍历。因此时间复杂度为 O(L)。

空间复杂度:O(1),我们只用了常量级的额外空间。

posted @ 2019-10-30 14:53  菜鸟奋斗史  阅读(200)  评论(0编辑  收藏  举报