首页 > 其他分享 >【删除链表的倒数第N个节点】双指针

【删除链表的倒数第N个节点】双指针

时间:2023-12-14 20:04:21浏览次数:25  
标签:head ListNode val int next 链表 倒数第 节点 指针

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

题解1:通过链表长度获取[倒数第n个节点]位置

  1. 计算链表长度
  2. 找到[倒数第N个节点]的前一个节点
  3. 删除[倒数第N个节点]
  • 注意特殊情况:删除的是第一个节点时,直接返回第二个节点即可
点击查看代码
/**
 * 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 tmp = head;
        int len = 0;
        while(tmp != null) {
            tmp = tmp.next;
            ++ len;
        }
        if(n == len) return head.next;
        int skip = len - n - 1; // 头节点跳到[倒数第n个节点]的前一个节点需要的步数
        ListNode res = head;
        while(skip -- != 0) {
            head = head.next;
        }
        head.next = head.next.next; //删除[倒数第n个节点]
        return res;
    }
}

题解2:通过双指针确定[倒数第n个节点]位置

  1. 指针fir从链表头前一个位置,跳n步
  2. 指针fir和指针sec同时跳(len-n)步,则fir指针跳到链表尾,sec指针跳到[倒数第n个节点]的前一个节点
  • 注意特殊情况:删除的是第一个节点时,直接返回第二个节点即可
点击查看代码
/**
 * 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 fir = new ListNode(0, head);
        ListNode sec = fir;
        // 第一个指针跳n下 至 第n个节点
        int skip = n;
        while(skip -- != 0) {
            fir = fir.next;
        }
        if(fir.next == null) return head.next;
        // 第一个指针跳len-n 下 至 尾节点
        // 第二个指针同时跳 至 [倒数第n个节点]的前一个节点
        while(fir.next != null) {
            fir = fir.next;
            sec = sec.next;
        }
        sec.next = sec.next.next;
        return head;
    }
}

标签:head,ListNode,val,int,next,链表,倒数第,节点,指针
From: https://www.cnblogs.com/Eve7Xu/p/17901669.html

相关文章

  • 【大数相加链表模拟】
    leetcode2.两数相加题意:两个长度为[1,100]的大数,分别倒序存储(个位在链表头)在两个链表中,计算两个数的和,并倒序存储在一个新链表,返回链表表头。数据中不存在前导零。题解:模拟大数相加,注意维护进位carry即可代码/***Definitionforsingly-linkedlist.*publicclassL......
  • 【回文链表】快慢指针+反转链表
    leetcode234.回文链表题意:判断一个链表是不是回文(中心对称)的【反转链表】题解1:得到原链表的反转链表,然后对比原链表与反转链表的内容是否一致即可。反转链表版本代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNo......
  • C++基础 -6- 二维数组,数组指针
    ———————二维数组,数组指针——————— ......
  • 【反转链表】while循环/递归
    leetcode206.反转链表题意:给定链表表头,反转链表,返回反转链表的表头【循环】题解:head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。双指针循环版本/***Definitionforsingly-linkedlist.*publicclassListNode......
  • 数据结构:双链表
    由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数1、定义与初始化typedefstructDNode{ElementTypedata;structDNode*prior,*next;}DNode,*DLinkList;boolInitialDLinkList(DLinkList&L){L=(DNode*)malloc(sizeof(DNode));......
  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......
  • 2023/12/10 链表
    #include<iostream>usingnamespacestd;typedefintElemType;//自定义链表数据元素为整数structLNode{ElemTypedata;LNode*next;};//初始化链表,返回值:失败返回nullptr,成功返回头结点地址LNode*InitList(){LNode*head=newLNode;//分配头结点......
  • 基于DAMON的LRU链表排序 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/lru_sort.htmlDAMON-basedLRU-listsSortingDAMON-basedLRU-listsSorting(DAMON_LRU_SORT)是一个静态内核模块,旨在用于基于主动和轻量级数据访问模式的(去)优先级排序,以使LRU列表成为更可信赖的数据访问模式源......
  • 关于雷电9模拟器开启指针位置不显示坐标问题的解决方案
    点击设置,进入关于手机页面,点击手机版本号,点击多次进入开发者模式进入输入模块,开启指针位置,如坐标未显示,则进入模拟器的安装目录,找到vms文件夹,进入并新建一个名称为debug的txt文本进行保存  重新启动模拟器即可......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......