题目:
Given a linked list, remove the n-th node from the end of list and return its head.
例子:
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
注释:
Given n will always be valid.
额外要求:
Could you do this in one pass?
思路:
根据提示,可以用两个指针,first
指针标记链表的末尾,second
指针标记链表末尾之前n位的链表。然后当链表到了末尾后,将second
指针的下一位连到second
指针的上一位。
知识点:
second
指针要在first
指针之前的n+1
位,因为这是单链表,没有second->prev
的指针,所以在去除链表倒数第n
位的时候,只能用second->next = second->next->next
。- 所有的临界情况都要考虑全面,比如只有一个元素的时候
input: [1] 1
- 出于上面一条的原因,
first
和second
指针的起点要设置在head
之前,可以省去判断。 - C++的指针要用
->
运算符 - 复习C++的constructor:如果需要返回的是一个指针,要用
ListNode* first = new ListNode(0)
- 函数的输入参数中,链表头是
head
指针,指向的是一个数值为val
,下一位是next
的ListNode
,如果被去掉的是链表头,那head
依然还是会指向这个node。因为我们是用second->next = second->next->next
来去掉节点的,所以改变的是second->next
,没有改变head
,即使second->next
是从head
开始的,但second
只是个指针变量,存储的是当前指向的地址。 - 出于上面一条的原因,可以用一个
dummy
变量存储初始点的地址,最后返回dummy->next
代码:
1 | /** |