考点
- 快慢指针
思路
思路一
- 首先求出单链表的长度
- 找出需要删除结点的前一个结点
- 删除需要删除的结点
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode *cur = head;
int linkedList_length=0;
while(cur != nullptr)
{
linkedList_length++;
cur = cur->next;
}
ListNode *dummyHead = new ListNode(0,head);
cur = dummyHead;
int pre_delete = linkedList_length + 1 - n;
while(pre_delete--)
{
if(pre_delete==0)
{
cur->next = cur->next->next;
}
else
{
cur = cur->next;
}
}
return dummyHead->next;
}
};
思路二:快慢指针
1.使快指针和慢指针都指向虚拟头结点
2. 先让快指针移动n+1步,目的是让慢指针最后能够移动到要删除的结点的前一个结点
3. 快慢指针一起移动,知道快指针为null
4. 此时慢指针指向的是需要删除结点的前一个结点
5. 用慢指针删除需要删除的结点
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode *dummyHead = new ListNode(0,head);
ListNode *fast = dummyHead;
ListNode *slow = dummyHead;
int fast_move_step = n + 1;
while(fast_move_step--)
{
fast = fast->next;
}
while(fast != nullptr)
{
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};