原题记录链接:

https://blog.csdn.net/chamao_/article/details/143489223?fromshare=blogdetail&sharetype=blogdetail&sharerId=143489223&sharerefer=PC&sharesource=chamao_&sharefrom=from_link

C++解法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeDuplicateNodes(ListNode* head) {
        ListNode* ob = head;
        while (ob != nullptr) {
            ListNode* oc = ob;
            while (oc -> next != nullptr) {
                if (oc -> next -> val == ob -> val) {
                    oc -> next = oc -> next -> next;
                } else {
                    oc = oc -> next;
                }
            }
            ob = ob -> next;
        }
        return head;
    }
};

今日C++知识点:
C++与C在链表中的区别在于C++拥有构造函数。

什么是构造函数?

构造函数(Constructor)是:在对象被创建时,自动调用,用来初始化对象的特殊函数。

关键词只有三个:

  • 对象被创建时

  • 自动调用

  • 初始化

在leetcode中定义的链表有三个构造函数:

第 1 个构造函数:无参构造

ListNode() : val(0), next(nullptr) {}

作用

创建一个 “默认节点”

等价理解

ListNode node; node.val = 0; node.next = nullptr;

什么时候会用到?

  • vector<ListNode> v(10);

  • new ListNode();

  • 某些算法里先占位


第 2 个构造函数:只给值

ListNode(int x) : val(x), next(nullptr) {}

作用

创建一个节点,有值,但后面暂时没人

使用示例

ListNode* n = new ListNode(5);

内存状态:

[val = 5 | next = nullptr]

👉 这是最常用的链表节点构造方式


第 3 个构造函数:值 + next

ListNode(int x, ListNode *next) : val(x), next(next) {}

作用(非常重要)

创建节点时,直接指定它的下一个节点

使用示例

ListNode* n2 = new ListNode(2); ListNode* n1 = new ListNode(1, n2);

链表瞬间成型:

n1 -> n2 -> nullptr

👉 一步到位,省掉 n1->next = n2;

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐