思路:快慢指针,快的指针先走 N步,慢的和快的再一起前进,当快的到最后的时候,慢的就是倒数第N个
只要判断临界情况即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null)
return head;
ListNode p = head;
ListNode q =head;
//用count记录走了多少步,和最终链表的长度
int count=0;
while(q.next!=null){
count++;
//前n步只让q指针走
if(count<=n){
q=q.next;
}else{
q=q.next;
p=p.next;
}
}
//循环结束时p到达了倒数n个元素的前面一个元素
//两个特殊情况,即链表只有一个元素和要删除的为头节点的情况
if(head.next==null || count+1 == n){
head=head.next;
}else{
p.next=p.next.next;
}
return head;
}
}
————————————————
版权声明:本文为CSDN博主「卷曲的葡萄藤」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39043567/article/details/89813993