php链表怎么删除重复结点
-
使用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年前 -
链表是一种常见的数据结构,它由一系列的节点组成,每个节点包含一个值和一个指向下一个节点的指针。当链表中存在重复的节点时,我们需要删除这些重复的节点,使得链表中的每个节点值都是唯一的。
删除重复节点的思路可以分为两种情况:一种是链表中的所有节点都是有序的,另一种是链表中的节点是无序的。下面分别介绍这两种情况的删除方法。
一、删除有序链表中的重复节点
假设有一个升序排列的链表,我们只需要遍历一次链表,将重复的节点删除即可。
具体步骤如下:
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年前 -
删除链表中重复节点的方法可以分为两种:暴力法和哈希表法。下面我将从方法和操作流程两个方面详细讲解。
方法一:暴力法
操作流程:
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年前