大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

链表操作,单指针或双指针技巧。

题目解答方法的文字分析

这个题目要求我们删除链表中所有重复的编号,只保留所有牛的不重复编号,并且返回已排序的链表。由于链表已经按照非降序排列,所以我们可以使用单指针或双指针技巧来解决。

具体步骤如下:

  1. 初始化一个指针 current,初始指向链表头节点。
  2. 循环遍历链表,比较当前节点的值和下一个节点的值是否相等。
  3. 如果相等,说明出现重复编号,我们需要跳过这个重复的节点,直接将当前节点的 next 指针指向下一个不重复的节点。
  4. 如果不相等,说明当前节点的编号是不重复的,我们继续遍历下一个节点。
  5. 当遍历结束后,返回链表的头节点。

本题解析所用的编程语言

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; // 返回去重后的链表头节点
    }
};

这段代码使用了单指针技巧来解决问题。我们通过遍历链表,判断当前节点的值是否和下一个节点的值相等,如果相等则跳过这个重复的节点,否则继续遍历下一个节点。在遍历过程中,我们释放掉重复节点的内存,以防止内存泄漏。

这样,最终返回的链表就是已排序的、不含重复编号的链表。

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!