知识点:链表
难度:中等
题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
方法一:两次遍历法
第一次遍历整个链表,得出链表的长度L。第二次遍历,到L-n+1为止,删掉这个节点即可。
方法二:一次遍历法
Golang:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
//一次遍历法
func removeNthFromEnd(head *ListNode, n int) *ListNode {
//设置两个指针
preNode := head
curNode := head
//一个指针前移n个位置,使它指向第n+1个节点
//这时两个指针相差n个位置
for i:=0;i<n ;i++ {
curNode=curNode.Next
}
if curNode==nil {
return preNode.Next
}
//当第一个指针到达链表尾部时,
//第二个指针刚好到达倒数第n个位置
for curNode.Next!=nil {
preNode=preNode.Next
curNode=curNode.Next
}
//删除倒数第n个节点
preNode.Next=preNode.Next.Next
return head
}
执行:
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)