申明:本文只用做自己的学习记录
题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
代码
type ListNode struct {
Val int
Next *ListNode
}
func removeNthFromEnd(head *ListNode, n int) *ListNode {
//本题采用双指针,指针1和指针2的间隔为n+1
//判断边界条件
if head.Next == nil {
return nil
}
//创建新的表头
dummy := &ListNode{0, head}
//创建指针
temp := dummy
//创建两个指针
//指针1
firstNode := temp.Next
//遍历到指针2的位置
for i := 0; i <= n; i++ {
//如果在遍历指针2的时候出现下一节点为空的情况,说明n的数值大小等于链表长度
//则删除链表第一个节点就好
if temp.Next == nil {
dummy.Next = dummy.Next.Next
return dummy.Next
}
temp = temp.Next
}
//指针2
secondNode := temp
//遍历链表直至指针2的子节点为nil,说明已经到链表尾部了
for secondNode.Next != nil {
//指针1后移
firstNode = firstNode.Next
//指针2后移
secondNode = secondNode.Next
}
//删除该节点后一位节点
firstNode.Next = firstNode.Next.Next
//返回头节点
return dummy.Next
}