给定一个链表,删除链表的倒数第 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个,时间复杂度O(n)
一趟的算法有用数组保存这个链表O(n),然后O(1)复杂度查找删除,但是细细比较比两趟算法时间复杂度要少一个n,但是空间复杂度为O(n),用空间换时间。
还有一种一趟的算法,类似于双指针的思路,不过这次是三指针,还添加了一个空的头节点,让所有的情形都能一般化。
func removeNthFromEnd(head *ListNode, n int) *ListNode {
//加一个头节点给这个链表:
resHead := &ListNode{0,head}
//del是真正要删除的节点
del := resHead.Next
//target倒数第一节点的位置
target := resHead
//bre永远在del前一个节点处
bre := resHead
for i:=0;i<=n && target != nil; i++ {
target = target.Next
}
for target != nil {
target = target.Next
del = del.Next
bre = bre.Next
}
bre.Next = del.Next
return resHead.Next
}