题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?

思路

双指针的一个典型应用
一开始看到倒数,我的思路就被带走到什么 链表长度-n = =
用双指针就很简单了,fast走n后,再让slow开始走,就是倒数啦(求倒数的一种应用
注意一下边界问题,重点就考虑只有一个节点啊这种极端情况,
模拟题画一下走一遍更清晰

  1. class Solution {
  2. public:
  3. ListNode* removeNthFromEnd(ListNode* head, int n) {
  4. ListNode* dummyhead =new ListNode();
  5. dummyhead->next =head;
  6. ListNode* fast =dummyhead;
  7. ListNode* slow =dummyhead;
  8. //双指针法,是fast、slow指针移动。不是->next移动。
  9. //注意只有一个节点的时候的边界问题:fast!=NULL
  10. while(n-- && fast!=NULL){
  11. fast =fast->next;
  12. }
  13. while(fast->next !=nullptr){
  14. slow =slow->next;
  15. fast =fast->next;
  16. }
  17. ListNode* temp =slow->next;
  18. slow->next =slow->next->next; //这里已经修改了头节点的next
  19. delete temp;
  20. //这里不能return head,因为可能删除的是第一个节点
  21. return dummyhead->next;
  22. }
  23. };