给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(head == nullptr || n<=0) return nullptr; ListNode* dummy = new ListNode(-1); dummy->next = head; ListNode* fast = dummy; ListNode* slow = dummy; for(int i=0;i < n+1 ;++i){ if(fast == nullptr){ return nullptr; } fast = fast->next; } while(fast) { fast = fast->next; slow = slow->next; } slow->next = slow->next->next; return dummy->next; } };
ListNode* FindKthToTail(ListNode* head, int k) { if(head == nullptr || k <= 0){ return nullptr; } ListNode* fast = head, * slow = head; for(int i=0;i<k;++i){ if(fast == nullptr) return nullptr; fast = fast->next; } while(fast){ fast = fast->next; slow = slow->next; } return slow; }
代码题(67)— 删除链表的倒数第 N 个结点、链表中倒数第 K个节点
原文:https://www.cnblogs.com/eilearn/p/14806800.html