方法一:暴力法(先遍历得到长度,再用长度减去N即可获得需要删除节点前的节点位置)
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode*cur = head;
int m =0;//计数节点个数
while(cur!=nullptr)
{
m++;
cur = cur->next;
}
int m1 = m-n;//求出需要删除节点前的一个节点
ListNode *cur1 = dummyhead;
while(m1--)
{
cur1 = cur1->next;
}
ListNode *tmp = cur1->next;
cur1->next = cur1->next->next;
delete tmp;
return dummyhead->next;
}
};
方法二:双指针法
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
int m = n+1; //fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作)
while(m-- && fast != NULL) {
fast = fast->next;
}
while (fast != NULL) {
// fast和slow同时移动,直到fast指向末尾
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
注意:最后返回的值:dummyhead->next