地址 https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

 

解法

解法 使用快慢指针 一个先出发 一个n次迭代后出发 先出发指针指向结尾 那么后出发指针就是要删除的节点

注意边界

代码1

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* removeNthFromEnd(ListNode* head, int n) {
  12. ListNode* p1 = head; ListNode* p2 = head;
  13. for(int i =0;i < n;i++){
  14. p1 = p1->next;
  15. }
  16. if(p1 == NULL) return p2->next;
  17. while(p1->next != NULL){
  18. p1=p1->next; p2 = p2->next;
  19. }
  20. p2->next = p2->next->next;
  21. return head;
  22. }
  23. };
  24. 作者:defddr
  25. 链接:https://www.acwing.com/solution/LeetCode/content/4346/
  26. 来源:AcWing
  27. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

代码2

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* removeNthFromEnd(ListNode* head, int n) {
  12. if(n==1 && head->next == NULL) return NULL;
  13. //两个指针相差N个 快指针到达尾部 慢指针就是要删除的节点
  14. ListNode* quick = head;
  15. ListNode* slow = head;
  16. while(n--){
  17. quick = quick->next;
  18. }
  19. if(quick == NULL) return head->next;
  20. while(1){
  21. quick = quick->next;
  22. if(quick == NULL){
  23. //删除slow的下一个指针
  24. slow->next = slow->next->next;
  25. return head;
  26. }
  27. slow = slow->next;
  28. }
  29. return head;
  30. }
  31. };

 

版权声明:本文为itdef原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/itdef/p/11923339.html