Given the head of a linked list, remove the nth node from the end of the list and return its head.
Example 1:
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1 Output: []
Example 3:
Input: head = [1,2], n = 1 Output: [1]
Constraints:
sz.1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
Follow up: Could you do this in one pass?
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode() : val(0), next(nullptr) {}
- * ListNode(int x) : val(x), next(nullptr) {}
- * ListNode(int x, ListNode *next) : val(x), next(next) {}
- * };
- */
- class Solution {
- public:
- ListNode* removeNthFromEnd(ListNode* head, int n) {
- ListNode*curr=head;
- int count=0;
- while(curr!=NULL){
- count++;
- curr=curr->next;
- }
- int cnt=count-n+1;
- struct ListNode*dummyHead=new ListNode(0,head);
- struct ListNode*pre=dummyHead;
- count=0;
- while(pre->next!=NULL){
- count++;
- if(count==cnt){
- pre->next=pre->next->next;
- }else{
- pre=pre->next;
- }
- }
- ListNode*ret=dummyHead->next;
- delete dummyHead;
- return ret;
- }
- };
我的这种方法是最容易想到的,先遍历一遍链表得到链表长度,需要注意的一点只有count++放的位置了。
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode() : val(0), next(nullptr) {}
- * ListNode(int x) : val(x), next(nullptr) {}
- * ListNode(int x, ListNode *next) : val(x), next(next) {}
- * };
- */
- class Solution {
- public:
- ListNode* removeNthFromEnd(ListNode* head, int n) {
- ListNode*dummyHead=new ListNode(0,head);
- ListNode*fast=dummyHead;
- ListNode*slow=dummyHead;
- n++;
- while(n--)fast=fast->next;
- while(fast!=NULL){
- fast=fast->next;
- slow=slow->next;
- }
- slow->next=slow->next->next;
- ListNode*temp=dummyHead->next;
- delete dummyHead;
- return temp;
- }
- };
1.中心思想:fast比slow多走n步,但是这会导致slow最后指向的位置刚好是要删除的,所以fast应该比slow多走n+1步,保证当fast==NULL的时候,slow是要被删除的倒数第n个位置的前一个位置。(fast和slow始终距离n+1)
2.C++代码要手动释放new的节点内存