php链表怎么删除重复结点

fiy 其他 129

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    使用PHP语言来实现链表删除重复节点,可以采用以下步骤:

    1. 定义链表节点的类,包含一个value属性和一个next属性,分别表示节点的值和指向下一个节点的指针。

    “`php
    class ListNode {
    public $value;
    public $next;

    public function __construct($value = 0) {
    $this->value = $value;
    $this->next = null;
    }
    }
    “`

    2. 创建一个链表,并向其中添加一些节点。

    “`php
    $list = new ListNode(1);
    $list->next = new ListNode(2);
    $list->next->next = new ListNode(2);
    $list->next->next->next = new ListNode(3);
    $list->next->next->next->next = new ListNode(4);
    “`

    3. 创建一个辅助指针$current,指向链表的头节点。

    “`php
    $current = $list;
    “`

    4. 使用一个while循环遍历链表,直到$current为null。

    5. 在循环中,判断当前节点和下一个节点的值是否相同。

    “`php
    while ($current != null && $current->next != null) {
    if ($current->value == $current->next->value) {
    // 当前节点和下一个节点的值相同
    // 删除下一个节点
    $current->next = $current->next->next;
    } else {
    // 当前节点和下一个节点的值不同
    // 移动当前节点到下一个节点
    $current = $current->next;
    }
    }
    “`

    6. 最后,返回处理后的链表。

    “`php
    return $list;
    “`

    完整代码如下:

    “`php
    class ListNode {
    public $value;
    public $next;

    public function __construct($value = 0) {
    $this->value = $value;
    $this->next = null;
    }
    }

    function deleteDuplicates($list) {
    $current = $list;

    while ($current != null && $current->next != null) {
    if ($current->value == $current->next->value) {
    $current->next = $current->next->next;
    } else {
    $current = $current->next;
    }
    }

    return $list;
    }

    $list = new ListNode(1);
    $list->next = new ListNode(2);
    $list->next->next = new ListNode(2);
    $list->next->next->next = new ListNode(3);
    $list->next->next->next->next = new ListNode(4);

    $result = deleteDuplicates($list);

    $current = $result;

    while ($current != null) {
    echo $current->value . ” “;
    $current = $current->next;
    }
    “`

    运行结果为:1 2 3 4,删除了重复的节点2。

    这样就实现了使用PHP语言删除链表中重复节点的操作。

    2年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    链表是一种常见的数据结构,它由一系列的节点组成,每个节点包含一个值和一个指向下一个节点的指针。当链表中存在重复的节点时,我们需要删除这些重复的节点,使得链表中的每个节点值都是唯一的。

    删除重复节点的思路可以分为两种情况:一种是链表中的所有节点都是有序的,另一种是链表中的节点是无序的。下面分别介绍这两种情况的删除方法。

    一、删除有序链表中的重复节点

    假设有一个升序排列的链表,我们只需要遍历一次链表,将重复的节点删除即可。

    具体步骤如下:

    1. 初始化一个指针p指向链表的头节点,同时初始化一个指针q指向p的下一个节点。
    2. 当q不为空时,进行循环。
    – 如果p的值和q的值相等,则将q指向的节点删除,并将p的指针指向下一个节点。
    – 如果p的值和q的值不相等,则将p和q都向后移动一位。
    3. 返回链表的头节点。

    示例代码如下:

    “`php
    class ListNode
    {
    public $val;
    public $next;

    public function __construct($val)
    {
    $this->val = $val;
    $this->next = null;
    }
    }

    function deleteDuplicates($head)
    {
    $p = $head;
    while ($p !== null) {
    $q = $p->next;
    while ($q !== null && $q->val == $p->val) {
    $q = $q->next;
    }
    $p->next = $q;
    $p = $p->next;
    }
    return $head;
    }
    “`

    以上代码的时间复杂度为O(n),其中n为链表的长度。

    二、删除无序链表中的重复节点

    对于无序链表的删除,我们可以使用哈希表来辅助删除操作。具体步骤如下:

    1. 创建一个哈希表,用于存储链表中已经出现过的节点的值。
    2. 初始化两个指针pre和cur,分别指向链表的头节点和头节点的下一个节点。
    3. 遍历链表,当cur不为空时,进行循环。
    – 如果cur的值已经在哈希表中存在,则将pre的next指针指向cur的next节点,并将cur节点删除。
    – 如果cur的值不在哈希表中存在,则将cur节点的值插入哈希表,并将pre和cur都向后移动一位。
    4. 返回链表的头节点。

    示例代码如下:

    “`php
    class ListNode
    {
    public $val;
    public $next;

    public function __construct($val)
    {
    $this->val = $val;
    $this->next = null;
    }
    }

    function deleteDuplicates($head)
    {
    $hashTable = [];
    $pre = new ListNode(0);
    $pre->next = $head;
    $cur = $head;
    while ($cur !== null) {
    if (isset($hashTable[$cur->val])) {
    $pre->next = $cur->next;
    unset($cur);
    } else {
    $hashTable[$cur->val] = true;
    $pre = $cur;
    }
    $cur = $cur->next;
    }
    return $head;
    }
    “`

    以上代码的时间复杂度为O(n),其中n为链表的长度。

    总结:

    无论是有序链表还是无序链表,删除重复节点的思路都比较简单明了。对于有序链表,只需要进行一次遍历,通过比较相邻节点的值来删除重复节点;对于无序链表,可以使用哈希表来辅助删除操作,同样只需要进行一次遍历就可以完成任务。以上就是删除重复链表节点的常见方法。

    2年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    删除链表中重复节点的方法可以分为两种:暴力法和哈希表法。下面我将从方法和操作流程两个方面详细讲解。

    方法一:暴力法

    操作流程:
    1. 创建一个指向链表头部的指针p,并将其移动到链表的第一个节点。
    2. 对于每一个节点,从当前节点开始遍历链表,查找是否存在与当前节点值相同的节点。
    3. 如果找到相同的节点,则将当前节点的下一个节点指向相同节点的下一个节点,然后继续从当前节点开始遍历。
    4. 如果找不到相同的节点,则将指针p移动到下一个节点,继续执行第2步。
    5. 当指针p指向null时,遍历结束。

    代码实现:
    “`
    function removeDuplicates($head) {
    $p = $head;
    while ($p != null) {
    $q = $p;
    while ($q->next != null) {
    if ($q->next->val == $p->val) {
    $q->next = $q->next->next;
    } else {
    $q = $q->next;
    }
    }
    $p = $p->next;
    }
    return $head;
    }
    “`

    方法二:哈希表法

    操作流程:
    1. 创建一个哈希表(也可以使用集合等数据结构),用于记录已经出现过的节点值。
    2. 创建一个指向链表头部的指针p,并将其移动到链表的第一个节点。
    3. 对于每一个节点,判断该节点的值是否已经在哈希表中存在。
    4. 如果节点值已经存在,则将当前节点的上一个节点指向当前节点的下一个节点,然后继续移动到链表的下一个节点。
    5. 如果节点值不存在,则将节点值添加到哈希表中,并继续移动到链表的下一个节点。
    6. 当指针p指向null时,遍历结束。

    代码实现:
    “`
    function removeDuplicates($head) {
    $hashTable = array();
    $dummy = new ListNode(0);
    $dummy->next = $head;
    $p = $dummy;
    while ($p->next != null) {
    if (in_array($p->next->val, $hashTable)) {
    $p->next = $p->next->next;
    } else {
    array_push($hashTable, $p->next->val);
    $p = $p->next;
    }
    }
    return $dummy->next;
    }
    “`

    以上就是删除链表中重复节点的方法和操作流程的详细讲解。其中,暴力法的时间复杂度为O(n^2),空间复杂度为O(1);哈希表法的时间复杂度为O(n),空间复杂度为O(n)。根据具体情况选择合适的方法来操作。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部