19. 删除链表的倒数第 N 个结点
-
解题思路:可以定义一个node节点,然后一个cur节点,node节点先走n-1步,然后cur和node同时走,如果node->next == null了,那么cur就是被删除的节点,此时,我们用pre节点指向cur的前一个节点(node和cur在走的时候,pre也跟着走),就可以删除cur节点了。
- 还有一种特例,删除的节点就是头节点
- 如果听不懂在说什么,可以画个图,具体的例子看看。
-
代码
/** * 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) { ListNode *first = head; // 先走n ListNode *cur = head; ListNode *pre = nullptr; while(--n) { first = first->next; } while(first->next != nullptr) { first = first->next; pre = cur; cur = cur->next; } if (pre != nullptr) { pre->next = cur->next; return head; } // 删除的就是头节点 return head->next; } };

浙公网安备 33010602011771号