和找出链表中倒数第k个节点相似
思路1,两次遍历,并且找出需删除的目标节点的前1节点,将其指向该节点的下下节点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode temHead = head;
int len=0;
while(temHead!=null)
{
temHead=temHead.next;
len++;
}
int x=len-n-1;
ListNode dummy=new ListNode();
dummy.next=head;
while(x>0)
{
head=head.next;
x--;
}
//注意点,如果删除节点是首节点,头结点指向下一节点,考虑只有一个节点并且删除首节点的情况
if(len==n)
{
dummy.next=dummy.next.next;
}
else if(len>n)
{
head.next=head.next.next;
}
return dummy.next;
}
}
思路2:一遍遍历,快慢指针,双指针
头结点dummy用来返回链表头
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast=head;
ListNode slow=head;
ListNode dummy=new ListNode(-1);
dummy.next=slow;
while(n>0)
{
fast=fast.next;
n--;
}
//删除节点为首节点
if(fast==null)
{
return head.next;
}
//【fast.next!=null】找到删除节点的前一节点
while(fast!=null&&fast.next!=null)
{
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return dummy.next;
}
}