leetcode19-删除链表的倒数第N个节点

只谈情不闲聊 提交于 2020-03-17 07:43:18

题目描述

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

示例

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

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

说明:给定的 n 保证是有效的。
你能尝试使用一趟扫描实现吗?

解题思路

1.快慢指针一次扫描法
要注意的是可能是要删除第一个节点

java代码如下:

public class Solution {
     private class ListNode {
         int val;
         ListNode next;
         ListNode(int x) { val = x; }
     }

     public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pre = new ListNode(Integer.MIN_VALUE);
        ListNode later = new ListNode(Integer.MIN_VALUE);
        pre.next = head;//引入虚拟头结点
        later.next = head;
         for (int i = 0; i < n; i++) {
             pre = pre.next;  //pre先行n步
             if(pre == null){    //说明链表节点个数不足n,就不存在倒数第n个节点
                 return null;
             }
         }
         //pre停在最后一个元素,later停在待删除节点的前一个节点
         while (pre.next != null){   //若改为pre==null,则pre停在最后一个元素的空位置,later会停在待删除元素
             pre = pre.next;//(这样满足pre先行一步,最后later停在倒数第一个;那么pre先行n步,later将停在倒数第n个)
             later = later.next;
         }
         ListNode relNode = later.next;
         if(relNode == head){    //如果需要删除的为头结点
             return head.next;    //head.next可能为空或者为第二个元素
         }
         later.next = relNode.next;
         relNode.next = null;
         return head;
    }
}

运行结果如下:

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!