剑指Offer(第2版)面试题18:删除链表的节点
- 手机
- 2025-07-21 19:20:16

剑指 Offer(第2版)面试题 18:删除链表的节点 剑指 Offer(第2版)面试题 18:删除链表的节点题目一:在 O(1) 时间删除链表结点题目二:删除链表中重复的节点 剑指 Offer(第2版)面试题 18:删除链表的节点 题目一:在 O(1) 时间删除链表结点
题目来源:
28. 在 O(1) 时间删除链表结点LeetCode 237. 删除链表中的节点算法:
得到要删除节点的下一个节点 pNext;将 pNext->val 赋给 node->val;让 node 指向 pNext->next;delete pNext。代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void deleteNode(ListNode *node) { ListNode *pNext = node->next; node->val = pNext->val; node->next = pNext->next; delete pNext; } };复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。
题目二:删除链表中重复的节点题目来源:29. 删除链表中重复的节点
代码 1:书上的版本,很长,但是没有内存泄漏
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *deleteDuplication(ListNode *head) { if (head == nullptr) return nullptr; ListNode *p = head, *pre = nullptr; while (p) { ListNode *pNext = p->next; bool needDelete = false; if (pNext && p->val == pNext->val) needDelete = true; if (needDelete) { int value = p->val; ListNode *pToBeDel = p; while (pToBeDel && pToBeDel->val == value) { pNext = pToBeDel->next; delete pToBeDel; pToBeDel = pNext; } if (pre == nullptr) head = pNext; else pre->next = pNext; p = pNext; } else { pre = p; p = p->next; } } return head; } };代码 2:简化版,没有 delete 重复节点,存在内存泄漏
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *deleteDuplication(ListNode *head) { auto dummy = new ListNode(-1); // 建立虚拟头结点 dummy->next = head; // 虚拟头结点指向头结点 auto p = dummy; while (p->next) // p的下一个节点不为空 { auto q = p->next; // q的下一个节点不为空,且q的下一个节点的值等于p的下一个节点的值 while (q->next && q->next->val == p->next->val) q = q->next; // 如果q==p的下一个节点 p=q if (q == p->next) p = q; // 如果不是说明存在重复元素,则p指向q的下一个节点即非重复节点 else p->next = q->next; } return dummy->next; } };复杂度分析:
时间复杂度:O(n),其中 n 是链表的长度。
空间复杂度:O(1)。
剑指Offer(第2版)面试题18:删除链表的节点由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“剑指Offer(第2版)面试题18:删除链表的节点”