package com.heu.wsq.niuke.top200;
/**
* 删除链表中倒数第N个节点
* @author wsq
* @date 2021/5/5
* 题目描述
* 给定一个链表,删除链表的倒数第 nn 个节点并返回链表的头指针
* 例如,
* 给出的链表为: 1\to 2\to 3\to 4\to 51→2→3→4→5, n= 2n=2.
* 删除了链表的倒数第 nn 个节点之后,链表变为1\to 2\to 3\to 51→2→3→5.
*
* 备注:
* 题目保证 nn 一定是有效的
* 请给出请给出时间复杂度为\ O(n) O(n) 的算法
*
* 示例1
* 输入:
* {1,2},2
* 返回值:
* {2}
*/
public class RemoveNthFromEnd {
/**
* 删除倒数第N个节点,与返回第N个节点题目类似
* 1、由于链表从前往后好查,从后往前就要从头遍历
* 2、因此题目要求的是删除第N个节点,所以我们只需要找到倒数第n+1个节点即可
* 3、考虑到有可能删除头节点的可能,因此,我们新增一个哨兵节点,使得删除头节点和其他节点的情况一致
* @param head
* @param n
* @return
*/
public ListNode removeNthFromEnd (ListNode head, int n) {
// write code here
if(head == null || n == 0){
return null;
}
// 创建哨兵节点
ListNode hair = new ListNode(-1);
hair.next = head;
// 利用快慢指针求得倒数第n+1个节点
ListNode fast = hair;
ListNode slow = hair;
// 倒数第n+1个节点,则需要快指针先走n步,此时慢指针就是倒数第n+1个节点
int t = 0;
while(t < n){
if(fast == null){
return null;
}
fast = fast.next;
t++;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return hair.next;
}
}
class ListNode{
public int val;
public ListNode next;
public ListNode(int val){
this.val = val;
}
}
删除链表中倒数第N个节点(快慢双指针)
最新推荐文章于 2024-11-05 19:36:08 发布