一、题目描述:19. 删除链表的倒数第N个节点(中等)
给定一个链表,删除链表的倒数第 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
1、定义2个指针front,head,同时指向初始节点。一个指针step先走n-1步(如果list长度小于n则直接返回head),因为删除前n个节点和最后的节点中间相差n-1步。如果list长度小于n的话返回头节点,如果list长度等于n,直接返回第二个节点指针。
2、然后两个指针同时往list遍历往后走,直到step->next->next ==NULL为止。step只走到最后一个节点的前一个节点的原因是为了找到要被删除节点的前一个节点(front此时就指向要被删除节点的前一个节点),这样直接front->next = front->next->next就相当于删除了倒数第n个节点。
3、返回预先保存的头节点。
4、要注意的边界条件
a)n<小于list长度
b)n=list长度,此时直接把头元素删除出,返回第二个节点指针(这里不判断,上面第二步执行结果会不正确)
三、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode * step = head;
ListNode * front = head;
while(step != NULL && n>1)
{
step = step->next;
n--;
}
if(n == 1 && step == NULL)
{
return NULL;
}
if(n == 1 && step->next == NULL)
{
return front->next;
}
if(n == 1 && step->next->next == NULL)
{
front->next = front->next->next;
return head;
}
while(step->next != NULL && step->next->next != NULL)
{
front = front->next;
step= step->next;
}
if(front == head)
{
return front->next;
}
front->next = front->next->next;
return head;
}
};