力扣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 };

 

posted on 2025-03-15 22:08  Coder何  阅读(15)  评论(0)    收藏  举报