LeetCode19. 删除链表的倒数第 N 个结点
文章目录
1.题目
2.思路
3.代码实现
(1) 倒序转正序
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int size = 0;//链表长度
ListNode* dummyHead = new ListNode(-1,head);//哨兵结点
ListNode* p = dummyHead;
while(p->next!= NULL)//第一次遍历:统计链表长度
{
p = p->next;
size++; //链表长度
}
int a = size-n+1;//待删除的结点正序所在位置 从1开始!!
if(a == 1)//特判头结点
{
ListNode*q = head;
dummyHead->next = head->next;
head = head->next;//连接节点
delete q;
delete dummyHead;
return head;
}
else//其他情况
{
ListNode *q = dummyHead;
//从哨兵结点出发 只需要走 待删除结点的所在正序-1 步即可
int cnt = size-n;
while(cnt--)//第二次遍历
q = q->next;
ListNode *m = q->next;
q->next = m->next;//连接节点
delete m;
delete dummyHead;
return head;
}
}
};
注意事项
(2) 双指针
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(-1,head) ;
ListNode* fast = dummyHead;//快指针
ListNode* slow = dummyHead;//慢指针
int a = n+1;
//1.快指针先走n+1步——为了使后期同步动时slow指向待删除结点的前一个,方便操作
while(a--)
fast = fast->next;//向后移n+1步
//2.快慢指针同步动,
while(fast!=NULL)
{
slow = slow->next;
fast = fast->next;
} //此时slow指向待删除结点的前一个结点
//3.删除操作
ListNode*p = slow->next;
slow->next = p->next;
delete p;
return dummyHead->next; //注意这里!
}
};