19.删除链表的倒数第N个节点
carl原文:19.删除链表的倒数第N个节点方法二是carl的方法。
19.删除链表的倒数第N个节点
/**
* 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:
int getlength(ListNode* head){
int length = 0;
while (head) {
++length;
head = head->next;
}
return length;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* newhead = new ListNode(0);
int length = getlength(head);
newhead ->next = head;
ListNode* cur = newhead;
for(int i = 1; i < length - n + 1; ++i ){
cur = cur -> next;
}
cur -> next = cur -> next -> next;
ListNode* res = newhead -> next;
delete newhead;
return res;
}
};
//方法二:快慢指针删除 双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。但要注意要让fast在先移动后多走一步。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* newhead = new ListNode(0);
newhead -> next = head;
ListNode* fast = newhead;
ListNode* slow = newhead;
for(int i = 1; i < n && fast; i++){
fast = fast -> next;
}
fast = fast -> next;
while(fast){
fast = fast -> next;
slow = slow -> next;
}
slow -> next = slow -> next -> next;
ListNode* res = newhead -> next;
delete newhead;
return res;
}
};