当前位置: 首页 > article >正文

利用双指针一次遍历实现”找到“并”删除“单链表倒数第K个节点(力扣题目为例)

Problem: 19. 删除链表的倒数第 N 个结点

文章目录

  • 题目描述
  • 思路
  • 复杂度
  • Code

题目描述

在这里插入图片描述
在这里插入图片描述

思路

1.欲找到倒数第k个节点,即是找到正数的第n-k+1、其中n为单链表中节点的个数个节点。
2.为实现只遍历一次单链表,我们先可以使一个指针p1指向链表头部再让其先走k步,此时再让一个指针p2指向单链表的头部接着使其同p1一起往后走,当p1指向单链表的尾部空指针时(即p1 = null)时停止,此时p2指向的即为正数n-k+1个节点也即使倒数第k个节点;
3.但是在单链表的删除中我们需要找到待删除节点的前驱节点我们在第二步中只是实现了找到倒数第k个节点离删除它还差一步,那我们就先找出倒数第k+1个节点再删除倒数第k个节点

复杂度

时间复杂度:

O ( n ) O(n) O(n);

空间复杂度:

O ( 1 ) O(1) O(1)

Code

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // virtual head node
        ListNode dummy = new ListNode(Integer.MIN_VALUE);
        dummy.next = head;
        ListNode p = dummy;
        // find the (n + 1) th node from the end
        // then we can remove the n-th node from the end
        ListNode x = findFromEnd(dummy, n + 1);
        // remove the n-th node from the end
        x.next = x.next.next;
        return dummy.next;
    }
    
    // return the k-th node from the end of the linked list
    ListNode findFromEnd(ListNode head, int k) {
        ListNode p1 = head;
        // p1 moves k steps firstly
        for (int i = 0; i < k; ++i) {
            p1 = p1.next;
        }
        ListNode p2 = head;
        // p1 and p2 move n - k steps together
        while (p1 != null) {
            p2 = p2.next;
            p1 = p1.next;
        }
        // p2 is now pointing to the (n - k + 1) -th node,which is the k-th node from the end
        return p2;
    }
}

http://www.kler.cn/a/521212.html

相关文章:

  • Leetcode 3434. Maximum Frequency After Subarray Operation
  • React应用深度优化与调试实战指南
  • 基于RIP的MGRE VPN综合实验
  • Jenkins上生成的allure report打不开怎么处理
  • 蓝桥杯模拟算法:多项式输出
  • 进程控制的学习
  • 在每一次灵感碰撞中,见证成长的蜕变--24年年度总结
  • 【协议详解】卫星通信5G IoT NTN SIB31-NB 信令详解
  • 金价高企需求疲软,周大福近三个月零售值下降14.2%
  • leetcode刷题记录(一百)——121. 买卖股票的最佳时机
  • <iframe>标签和定时调用函数setInterval
  • ubuntu怎么杀死指定的进程的pid
  • 正在更新丨豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)
  • web前端9--定位
  • 向量和矩阵算法笔记
  • Tomcat - 高并发性能参数配置
  • 基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
  • 组件框架漏洞
  • mantisbt添加修改用户密码
  • 如何提升虾皮直播的网络速度
  • UE求职Demo开发日志#11 完善所有普攻伤害判定,普攻加个小特效
  • Kmesh v1.0 正式发布!7 大特性提升网络流量管理效率和安全性
  • 【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
  • 1.24学习
  • 人工智能前沿技术进展与应用前景探究
  • 彻底理解JVM常量池