快慢指针法,要注意,慢指针指向结点的下一个结点才是要删除的结点,如果慢指针指向的结点是要删除的结点,那么就不好删除这个结点。 同样本题需要设置一个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; } };