题目描述
Given a linked list, remove the n-th node from the end of list and return its head.
Example:
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.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
解题代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == nullptr || head->next == nullptr)
return nullptr;
int step = 1;
ListNode * first = head, *second = head, *parent = head;
while (step++ < n)
{
first = first->next;
}
if (first->next == nullptr) {
head = head->next;
delete[] second;
return head;
}
while (first->next != nullptr)
{
first = first->next;
parent = second;
second = second->next;
}
parent->next = second->next;
delete[] second;
return head;
}
};
解题思路
- 最常见的方法是遍历两遍链表,第一遍得到链表的节点数目,第二遍是找到指定位置的链表。
- 可以做到只遍历一遍链表,但需要两个指针。因为要删除的是倒数第n个节点,那我们让两个指针指向的节点相差n个,那么当前面的指针指向链表尾节点时,后面的指针指向的节点就是我们想要删除的节点。
- 由于我们要删除节点时,需要拿到的节点是待删除节点的父节点。初始化时我们让父亲节点指针和删除节点指针指向头节点。先判断两个指针相差n时前面的指针是不是已经指向尾节点了,是的话删除的就是头节点。否则就循环至尾节点,使用父节点指针删除待删除节点。