力扣19. 删除链表的倒数第 N 个结点

双指针法,保证左右指针之间距离为n-1,就能保证右指针到达最后一个的时候,左指针到达倒数第n个
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* removeNthFromEnd(ListNode* head, int n) { 14 if (head == nullptr || head -> next == nullptr) { 15 return nullptr; 16 } 17 ListNode *vhead = new ListNode(0, head); 18 ListNode *pre = vhead, *left = head, *right = head, *nxt = head -> next; 19 // 右指针先走n-1步 20 for (int i = 1; i < n; ++i) { 21 right = right -> next; 22 } 23 // 右指针到尾部即左指针到倒数第n的位置 24 while (right = right -> next) { 25 pre = left; 26 left = left -> next; 27 nxt = left -> next; 28 29 } 30 pre -> next = nxt; 31 return vhead -> next; 32 } 33 };
浙公网安备 33010602011771号