题目描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如:
给出的链表为:1→2→3→4→5, n= 2
删除了链表的倒数第 n个节点之后,链表变为1→2→3→5
以下是本篇文章正文内容,下面案例可供参考
解题思路
看到此题,立马想到了找到链表倒数第k个结点 方法类似,
若要删除一个结点,可以将此结点的前驱的后继变成要删除的结点的后继,这样描述可能有点绕,直接看代码:slow.next = slow.next.next
,可以理解为跳过要删除的结点
若要删除链表的倒数第二个结点,则让慢指针定位到此结点的前驱即可,定义两个快慢指针接结点,fast
、slow
,先让fast
走k步,再让fast
、slow
一起往后走,当fast
走到最后一个结点,即fast.next ==null
时,slow
此时就在倒数第k个结点的前驱处
再使用刚才说的删除的方法即可
代码如下
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
public ListNode removeNthFromEnd (ListNode head, int n) {
// write code here
if(head == null||n<1){
return null;
}
ListNode fast = head;
ListNode slow = head;
while(n != 0){
if(fast == null){
return null;
}else{
n--;
fast = fast.next;
}
}
//如果n的值等于链表的长度,此时,删除的即为链表的头结点
if(fast == null){
return head.next;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}
总结
此题的思考点在于:
如果n的值等于链表的长度,此时,删除的即为链表的头结点,则直接返回头结点的后继即可。
if(fast == null){
return head.next;
}
如果本文对你有所帮助,要记得点赞评论哦~
若是有描述不准确的地方,欢迎大家评论区指正,一起学习~