删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <iostream> #include <vector> #include <algorithm> using namespace std;
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 (n < 1) { return head; } ListNode *fast = head; while (fast != nullptr && n > 0) { fast = fast->next; n--; } if (n != 0 && fast == nullptr) { return head; }
if (n == 0 && fast == nullptr) { return head->next; }
ListNode *last = head; while (fast->next != nullptr) { fast = fast->next; last = last->next; } ListNode *temp = last->next; last->next = temp->next; temp->next = nullptr; delete temp; return head; } };
int main() { ListNode *list = new ListNode(0);
ListNode *temp = list; for (int i = 1; i < 6; i++) { temp->next = new ListNode(i); temp = temp->next; } list = list->next; temp = Solution().removeNthFromEnd(list, 6); while (temp != nullptr) { std::cout << temp->val << " "; temp = temp->next; } std::cout << std::endl; }
|