func removeNthFromEnd(head *ListNode, n int)*ListNode {
//没有节点或仅有一个节点,返回空
if head==nil||head.Next==nil{
return nil
}
//双指针,指针1先走n步
p1:=head
p2:=head
for n>0{
p1=p1.Next
n--
}
//指针1直接走到末尾第0个节点(空节点),说明n等于链表长度,删除第一个节点
if p1==nil{
return head.Next
}
//指针1走到倒数第一个节点,指针2在倒数第n+1个节点位置
for p1.Next!=nil{
p1=p1.Next
p2=p2.Next
}
p2.Next=p2.Next.Next
return head
}
这个问题比较简单,采用双指针分开走n步即可。但过程中会遇到首尾指针越界的问题需要特殊考虑。