每天一题LeetCode【第16天】

T19. Remove Nth Node From End of List【Medium

题目

给定一个链表,从链表的末尾删除第n个节点并返回它的头。

例如,

   给出链表: 1->2->3->4->5,以及 n = 2.

   在移除了倒数第二个节点后, 链表变成了 1->2->3->5.

补充:

给出的 n 总是有效地

尝试把这题一遍过

思路

① 首先建议不明白链表的先了解一下链表

② 代码用start保存首节点,用fast和slow结合起来寻找到目标节点位置

③ 因为链表不能从后往前移动,也不知道长度,所以先把 fast 前移 n,保持 slow 和 fast 的差值,把 fast 移动到最后(也就是链表常用的 fast==null),然后此时 slow 就能容易的定位到倒数第n个数

④ 链表常用去节点方式:slow.next = slow.next.next; 下面举个例子

链表 A->B->C  去掉B:A 放开 B 的尾巴,抓住 C 的尾巴

⑤ 具体看代码以及注释~

⑥ 有问题欢迎吐槽哈~

代码

代码取自 Top Solution,稍作注释

/**
 * 给出的ListNode的结构
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
   public ListNode removeNthFromEnd(ListNode head, int n) {
    //初始化一个 val=0 的 ListNode ,并赋给 start,slow,fast
    ListNode start = new ListNode(0);
    ListNode slow = start, fast = start;
    //把传入的链表赋给slow.next
    slow.next = head;
    //把 fast 往前移动 n,使得fast和slow相差n
    for(int i=1; i<=n+1; i++)   {
        fast = fast.next;
    }
    //把fast移动到最后一个, 保持slow一起移动,相差不变,此时slow就是从后往前n
    while(fast != null) {
        slow = slow.next;
        fast = fast.next;
    }
    //通过这句代码跳过中间的节点
    slow.next = slow.next.next;
    //start用来保存首节点,返回start.next就是首节点
    return start.next;
}
}  

补充

关于代码中的,debug了一下,slow 和 fast 的地址和 start 是一样,所以是传递地址的,在后面改了任一一个其他的也会改。

 ListNode start = new ListNode(0);
 ListNode slow = start, fast = start;

可以看到地址是相同的(哎这个应该是地址吧)~


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容