快慢指针法,要注意,慢指针指向结点的下一个结点才是要删除的结点,如果慢指针指向的结点是要删除的结点,那么就不好删除这个结点。 同样本题需要设置一个yummyhead结点来保证循环的一致性。
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
// 删除链表的倒数第n个结点
// 用快慢指针法解决问题,先让快指针移动n次,然后让快慢指针同步后移
// 直到快指针为nullptr,这样慢指针指向结点的下一个结点就是要删除的结点
// 为了保持循环的统一性,需要设置一个yummyhead结点
if (!head) return head;
ListNode *yummyhead = new ListNode(-1);
yummyhead->next = head;
ListNode *slow = yummyhead, *fast = yummyhead;
for (int i = 0; i < n && fast->next != nullptr; i++) {
fast = fast->next;
}
// n保证有效,所以就不用判断是否提前到达了表尾
while(fast->next) {
slow = slow->next;
fast = fast->next;
}
ListNode *q = slow->next->next;
slow->next = q;
return yummyhead->next;
}
};
京公网安备 11010502036488号