一、题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
二、思路:
基于双指针法,front是前指针,rear为尾指针,pre_front为前指针的前一个(用于删除front)。
front与rear之间相差n个节点。当 rear->next==NULL(即rear指向链表末尾的最后一个元素) 时,front指向待删除的节点(即倒数第n个)。
三、题解:
/**
* 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* pre_front = NULL;//是front的前一个,用于删除倒数第n个
ListNode* front = NULL;//双指针的靠前指针,与rear相隔n
ListNode* rear = NULL;//双指针的靠后指针
int i = 1;
rear = head;//尾指针从head开始遍历
while(i < n){
rear = rear -> next;
if(rear == NULL)
break;
i++;
}
if(rear == NULL)//该链表没有n个元素
return head;
//该链表至少有n个元素,当前rear与head相差n个节点
front = head;
if(rear -> next == NULL){//一共只有n个节点,则head=front是待删除节点
ListNode* del = head;
head = head -> next;
delete(del);
return head;
}
else{//一共多于n个点
front = front -> next;
rear = rear -> next;
pre_front = head;
while(rear->next != NULL){
front = front -> next;
rear = rear -> next;
pre_front = pre_front -> next;
}
//必找到倒数第n个,即front为待删除节点,pre_front为其前一个点
ListNode* del2 = front;
pre_front -> next = front -> next;
delete(del2);
return head;
}
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。