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;

相关文章
|
29天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
33 1
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
64 1
|
16天前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
9 1
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
29天前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
43 0
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
77 0
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
48 2
|
6月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
51 1