LeetCode19删除链表中倒数第n个结点

简介: 推导公式:通过举例,我们可以发现 n 和 链表长度 size 的关系:

题目:

image.png


解题思路:


推导公式:通过举例,我们可以发现 n 和 链表长度 size 的关系:

size=5 的链表的倒数第 n 个数是正数第 size-n+1 个数.

比如,size为5的链表中倒数第3个数,正数第3(5-3+1);倒数第2的数是正数第4(5-2+1);


删除思路:因为是单链表,我们只能顺序遍历,从前往后,那么我们要做的就是控制遍历的次数。


引入中间指针temp(初始化为head)

每遍历一次就后移一位(temp=temp.next);

直到遍历到要删除的节点的前一个结点,退出遍历


删除操作:temp.next=temp.next.next;

需要注意的是:如果删除的结点是倒数第一个结点(最后一个节点),那么就不能使用这个语句,因为temp.next为null,temp.next.next 就是null.next,会报错,所以我们需要专门拎出来考虑。


/**
 * 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) {
       ListNode temp = head;
       int size=0;
       //计算链表大小
       while(temp!=null){
           size++;
           temp=temp.next;
       }
       //如果链表只有一个元素
       if(head.next==null && n==1){
           return null;
       }
       temp=head;
       //如果删除的是首元结点(链表长度=n)
       if(n==size){
           head=head.next;
           return head;
       }
       //如果删除的是链表最后一个结点
       if(n==1){
           for(int i=1;i<(size-n+1)-1;i++){
            temp=temp.next;
           }
           temp.next=null;
       }else if(n>1){//如果删除的不是最后一个结点
           for(int i=1;i<(size-n+1)-1;i++){
               temp=temp.next;
           }
           temp.next=temp.next.next;
       }
return head;
    }
}

写在最后

这道题中,由于每次循环执行体为 temp=temp.next;它会指向指向下一个结点而不是当下这个结点,所以我们必须少遍历一次,在条件语句上 -1;

相关文章
|
11月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
117 1
|
3月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
5月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
171 10
|
11月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
168 1
|
10月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
218 1
|
11月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
117 0
LeetCode第二十四题(两两交换链表中的节点)
|
11月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
123 0
|
11月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
227 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表