C++实现LeetCode(19.移除链表倒数第N个节点)
[LeetCode] 19. Remove Nth Node From End of List 移除链表倒数第N个节点
Given a linked list, remove the nth node from the end of list and return its head.
For example,
文章图片
Given linked list: 1->2->3->4->5, and n = 2.Note:
After removing the second node from the end, the linked list becomes 1->2->3->5.
Given n will always be valid.
Try to do this in one pass.
这道题让我们移除链表倒数第N个节点,限定n一定是有效的,即n不会大于链表中的元素总数。还有题目要求一次遍历解决问题,那么就得想些比较巧妙的方法了。比如首先要考虑的时,如何找到倒数第N个节点,由于只允许一次遍历,所以不能用一次完整的遍历来统计链表中元素的个数,而是遍历到对应位置就应该移除了。那么就需要用两个指针来帮助解题,pre 和 cur 指针。首先 cur 指针先向前走N步,如果此时 cur 指向空,说明N为链表的长度,则需要移除的为首元素,那么此时返回 head->next 即可,如果 cur 存在,再继续往下走,此时 pre 指针也跟着走,直到 cur 为最后一个元素时停止,此时 pre 指向要移除元素的前一个元素,再修改指针跳过需要移除的元素即可,参见代码如下:
方式一:
class Solution {public:ListNode* removeNthFromEnd(ListNode* head, int n) {if (!head->next) return NULL; ListNode *pre = head, *cur = head; for (int i = 0; i < n; ++i) cur = cur->next; if (!cur) return head->next; while (cur->next) {cur = cur->next; pre = pre->next; }pre->next = pre->next->next; return head; }};
方式二:
class Solution {public:int getLength(ListNode* head) {int length = 0; while (head) {++length; head = head->next; }return length; }ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy = new ListNode(0, head); int length = getLength(head); ListNode* cur = dummy; for (int i = 1; i < length - n + 1; ++i) {cur = cur->next; }cur->next = cur->next->next; ListNode* ans = dummy->next; delete dummy; return ans; }};
【C++实现LeetCode(19.移除链表倒数第N个节点)】到此这篇关于C++实现LeetCode(19.移除链表倒数第N个节点)的文章就介绍到这了,更多相关C++实现移除链表倒数第N个节点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 老生常谈c++中的静态成员
- C语言链表实现工资管理系统
- C语言使用链表实现学生籍贯管理系统
- 面试经验|C语言实现的数据结构之------哈希表
- 二叉树(Binary|LeetCode 536. Construct Binary Tree from String - 二叉树系列题18
- 为什么工厂要实现自动化、智能化()
- 人工智能如何帮助水电实现可持续发展
- #|二进制粒子群算法的配电网故障定位(Python&Matlab实现)
- #|美团外卖——物流论文小笔记(Python实现)
- #|多目标优化NSGA-II(非支配排序常见于遗传算法)(C语言实现)