大家好,我是开车的阿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; // 返回去重后的链表头节点 } };
这段代码使用了单指针技巧来解决问题。我们通过遍历链表,判断当前节点的值是否和下一个节点的值相等,如果相等则跳过这个重复的节点,否则继续遍历下一个节点。在遍历过程中,我们释放掉重复节点的内存,以防止内存泄漏。
这样,最终返回的链表就是已排序的、不含重复编号的链表。