大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
链表操作,单指针或双指针技巧。
题目解答方法的文字分析
这个题目要求我们删除链表中所有重复的编号,只保留所有牛的不重复编号,并且返回已排序的链表。由于链表已经按照非降序排列,所以我们可以使用单指针或双指针技巧来解决。
具体步骤如下:
- 初始化一个指针
current,初始指向链表头节点。 - 循环遍历链表,比较当前节点的值和下一个节点的值是否相等。
- 如果相等,说明出现重复编号,我们需要跳过这个重复的节点,直接将当前节点的
next指针指向下一个不重复的节点。 - 如果不相等,说明当前节点的编号是不重复的,我们继续遍历下一个节点。
- 当遍历结束后,返回链表的头节点。
本题解析所用的编程语言
C++
完整且正确的编程代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* current = head;
while (current && current->next) {
if (current->val == current->next->val) {
ListNode* duplicateNode = current->next;
current->next = duplicateNode->next; // 跳过重复节点
delete duplicateNode; // 释放重复节点的内存
} else {
current = current->next; // 继续遍历下一个节点
}
}
return head; // 返回去重后的链表头节点
}
};
这段代码使用了单指针技巧来解决问题。我们通过遍历链表,判断当前节点的值是否和下一个节点的值相等,如果相等则跳过这个重复的节点,否则继续遍历下一个节点。在遍历过程中,我们释放掉重复节点的内存,以防止内存泄漏。
这样,最终返回的链表就是已排序的、不含重复编号的链表。

京公网安备 11010502036488号