LeetCode 19 Remove Nth Node From End of List
题意
给一个链表,要求删除链表中的倒数第n
个节点并返回链表的首节点,数据保证n
有效。要求一次遍历得到结果。
思路
方法1 指针数组
将所有的节点指针值存到数组中,遍历之后通过数组直接访问倒数第n
个指针,不过这种方法显然有点不太好。
方法2 当前倒数第n个节点
要找的是倒数第n
个节点,那么链表的长度与要找的节点的关系就是:
长度 节点
n head
n+1 head->next
n+2 head->next->next
...
也就是说,只需从第n
个节点开始设置要找的节点who
为头结点,之后遍历的同时who = who->next
即可。不过需要注意的是,要删除who
节点,需要记录who
的前一个节点。
代码
方法2的代码,注意代码中who
代表的是待删节点的前一个节点:
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *who = head, *p = head;
for (int i = 1; i <= n; i++)
p = p->next;
if (!p)
return head->next;
while (p && p->next)
p = p->next, who = who->next;
who->next = who->next->next;
return head;
}
};