zoukankan      html  css  js  c++  java
  • 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),我们只用了常量级的额外空间。

  • 相关阅读:
    最长公共子序列-动态规划
    归并排序
    最大子段和-3种方法
    kafka compaction 分析(基于kafka 0.10.2版本)
    [转载]interp1
    [转]mat2gray函数原理分析
    Java 位运算(移位、位与、或、异或、非)与逻辑运算
    ML01a
    [第1集] 机器学习的动机与应用
    tap4fun公司面试总结
  • 原文地址:https://www.cnblogs.com/ysw-go/p/11764899.html
Copyright © 2011-2022 走看看