首页 > 其他分享 >[LeetCode Hot 100] LeetCode19. 删除链表的倒数第N个结点

[LeetCode Hot 100] LeetCode19. 删除链表的倒数第N个结点

时间:2023-12-05 21:44:41浏览次数:45  
标签:dummy ListNode val int next 链表 Hot 节点 倒数第

题目描述

思路一:采用两次遍历

  • 第一遍遍历先获取链表的长度length
  • 第二次从dummy节点开始走length - n步
  • 然后将该节点指向下下个节点

思路二:采用一次遍历

  • 设置虚拟节点dummyHead指向head
  • 设定双指针p和q,初始都指向虚拟节点dummyHead
  • 移动q,直到p与q之间相隔的元素个数为n(即q走n+1步)
  • 同时移动p与q,直到q指向的为NULL
  • 将p的下一个节点指向下下个节点

方法一:对应思路一

/**
 * 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 p = head;
        ListNode dummy = new ListNode(0, head);
        ListNode q = dummy;
        int length = 0;
		// p就是用来统计链表的长度
        while (p != null) {
            length ++;
            p = p.next;
        }
		// q是用来找到待删除节点的前一个节点
		// 然后将该节点的next指针指向下下个元素
        for (int i = 0; i < length - n; i ++) {
            q = q.next;
        }
        q.next = q.next.next;
        return dummy.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) {
        // 设置虚拟节点dummyHead指向head
        ListNode dummy = new ListNode(0, head);
        // 设定双指针p和q,初始都指向虚拟节点dummyHead
        ListNode p = dummy, q = dummy;
        // 移动q,直到p与q之间相隔的元素个数为n
        for (int i = 0; i < n + 1; i ++) {
            q = q.next;
        }
        // 同时移动p与q,直到q指向的为NULL
        while (q != null) {
            p = p.next;
            q = q.next;
        }
        // 将p的下一个节点指向下下个节点
        p.next = p.next.next;
        return dummy.next;
    }
}

标签:dummy,ListNode,val,int,next,链表,Hot,节点,倒数第
From: https://www.cnblogs.com/keyongkang/p/17878346.html

相关文章

  • [LeetCode Hot 100] LeetCode21. 合并两个有序链表
    题目描述思路:新建dummy去"穿针引线"新建一个dummy节点去"穿针引线"注意最后返回的是dummy.next方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this......
  • 【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行机制,RTOS Tr
    从源码的角度来看,OS内核源码就是通过各种链表组装起来的,FreeRTOS就是下面几个链表组成的。FreeRTOS的调度,任务切换就是倒腾这几个链表。而其它的几款OS是一个链表就一撸到底了,FreeRTOS是搞了好几个。所以视频里面就重点介绍下这个,其它的支持的也做个拓展说明。搞清楚这几个链表也......
  • [LeetCode Hot 100] LeetCode234. 回文链表
    题目描述思路1:将值复制到数组中然后使用双指针计算链表的长度创建等长的数组将链表中的数依次放入数组中使用左右指针判断链表是否是回文链表时间复杂度:O(n)空间复杂度:O(n)思路2:快慢指针+反转链表用快慢指针,快指针走两步,慢指针走一步,快指针遇到终止位置时,慢指针就在......
  • [LeetCode Hot 100] LeetCode206. 反转链表
    题目描述思路:双指针算法方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=v......
  • [LeetCode Hot 100] LeetCode49. 字母异位词
    题目描述思路:哈希表对字符串排序,如果是异位词,排序后就变成一样的了。方法一:classSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(inti=0;i<strs.length;i......
  • [LeetCode Hot 100] LeetCode141. 环形链表
    题目描述思路:快慢指针slow指针:每次移动一个节点fast指针:每次移动两个节点如果链表中存在环,fast指针最终会在某一时刻追上slow指针,这是由于移动速度快的fast指针会在某个时刻绕圈并追上速度慢的slow指针条件fast!=null&&fast.next!=null保证了在每一步迭代中,fast和......
  • [LeetCode Hot 100] LeetCode3. 无重复字符的最长子串
    题目描述思路:滑动窗口定义需要维护的变量//1.定义需要维护的变量intmax_len=0;Map<Character,Integer>hashmap=newHashMap<>();窗口不满足条件,窗口收缩。窗口不是固定大小所以用while//4.窗口不满足条件:窗口收缩//满足这个条件说明有重复元素//这......
  • [LeetCode Hot 100] LeetCode438. 找到字符串中所有字母异位词
    题目描述思路:滑动窗口模板需要维护的变量://1.用于存放结果List<Integer>res=newArrayList<>();//2.定义需要维护的变量:根据题意可知是一个哈希表Map<Character,Integer>map=newHashMap<>();Map<Character,Integer>hashmap_p=newHashMap<>();for(c......
  • 链表算法笔记
    ​ 类型:单链表、双链表、循环链表操作:删除节点、添加节点        在删除节点时,C++里最好是再手动释放所删除的节点,释放内存,但是如Java、Python等语言,它们有自己的内存回收机制,就不需要手动释放了。使用虚拟头节点的原因使第一个节点和其他节点的增加和删除操作统一,......
  • 内核链表
    内核链表在很多嵌入式的代码中都有用到,因为这个链表很好用,并且代码的统一性会增强代码的可读性,因此这里简单记录一下内核链表的使用,首先是库文件,这里也就是从内核中获取的,下面的代码做了一点注释。#ifndef_LINUX_LIST_H#define_LINUX_LIST_H//include/linux/types.hstruct......