美文网首页LeetCode笔记
【LeetCode】单链表 -删除列表中的倒数第n个节点

【LeetCode】单链表 -删除列表中的倒数第n个节点

作者: 幽泉流霜 | 来源:发表于2019-10-24 21:54 被阅读0次

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

方法一 两次循环
第一次 循环找出一共有多少个节点
第二次循环定位到要删除的节点的前一个节点
思路很简单 但是写起来要对单链表的每一次移动有清晰的了解

要注意需要设立一个初始节点 .next = 头结点
(为了方式要删除的节点为第一个节点)
再设立一个 临时节点p
第二次循环时临时节点的位置已经在了末尾
所以要重新赋值到头结点

  ListNode dummy = new ListNode(0);
//       dummy.next = head;
//       ListNode first = head;
//       int length = 0 ;
//       while (first!=null){
//           first = first.next;
//           length++;
//       }
//       length = length-n;
//       first = dummy;
//       while(length>0){
//           first = first.next;
//           length--;
//       }
//       first.next = first.next.next;
//       return dummy.next;

方法二
同样先设立一个初始的头结点。
因为只通过一次循环
所以设立两个节点
先将其中一个往前移动n个位置
然后同时将两个节点移动到相同的位置
此时seconde所在的位置就是要删除节点的前一个位置

 ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode first = dummy;
        ListNode second = dummy;
        for(int i = 0 ; i<n ; i++){
            first = first.next;
        }
        while(first.next!= null){
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        return dummy.next;

相关文章

网友评论

    本文标题:【LeetCode】单链表 -删除列表中的倒数第n个节点

    本文链接:https://www.haomeiwen.com/subject/ebuvuctx.html