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

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

文章目录

题目描述


思路

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

java 复制代码
/**
 * 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;
    }
}
相关推荐
Pniubi11 分钟前
力扣46全排列(回溯(递归))
算法·leetcode·职场和发展
文丑颜不良啊1 小时前
LeetCode1461~1480题目解析
java·leetcode
ZhengEnCi10 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David10 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi11 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_61811 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang11 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_9707038313 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你021413 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi14 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm