题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
分析
双指针,和之前一样的解法,先走n,然后两个指针一块儿走,a指针走到头了,b指针正好在倒数n这个位置上。
解法
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
if head == nil || n <= 0 {
return head
}
a, b := head, head
for i:= 0; i < n;i++ {
b = b.Next
if b == nil {
// 长度刚好等于链表长度时候,那么直接删除头。
if i == n-1 {
head = head.Next
return head
}
return nil
}
}
// 假设b走到头了nil了,那么a会正好站在n位置上。所以判断Next不为nil,就能让a停在n的前一个
for b.Next != nil {
a = a.Next
b = b.Next
}
// 删除,b都有Next,a必然有,所以不怕Panic。
a.Next = a.Next.Next
return head
}