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;

目录
打赏
0
0
0
0
37
分享
相关文章
|
5月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
59 1
|
5月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
82 0
Leetcode第21题(合并两个有序链表)
|
5月前
|
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
108 1
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
43 1
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
54 0
LeetCode第二十四题(两两交换链表中的节点)
|
5月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
74 0
|
5月前
|
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
136 0
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
7月前
|
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
84 6
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
172 2