给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
PHP是采用类的方式来定义链表的
常用的链表节点定义为:
//单链表的定义
class ListNode{
public $data = '';//链表的数据域
public $next = null;//链表的指针域
public function __construct($val)
{
$this->data = $val;
}
下面是一个链表赋值的方法,其中$head代表的链表的头节点
function fetchNode($head){
$current = $head;//在此需要注意一个问题,在php中对象的赋值,其实是对象地址的赋值,即$current = &$head,所以操作$current就相当于操作$head
while(!is_null($current->next)){
$current = $current->next;
echo $current->data.'->';
}
有几个问题需要注意下:
$data存放的是当前链表节点的数值,每个节点的$next指针域中存放着一个对象或者null。这个对象就是定义的单链表的一个节点。比如说[1,2,3,4,5],$data中存放的就是1,而$next中存放的是[2,3,4,5]- 因此 $head->next 必须赋值一个节点对象,而不能是val。
- php链表中,常用
while($current ->next != null)和$current = $current->next语句配合进行链表遍历,而$current = $head相当于$current = &$head,也就是引用,所以循环中不能直接使用$head = $head->next,因为这样会导致原始$head被覆盖。
- 题目解法
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $head
* @return ListNode
*/
function deleteDuplicates($head) {
$curr = $head;
while($curr!=null && $curr->next!=null){
if($curr->val==$curr->next->val){
// 每次只对current进行操作
$curr->next = $curr->next->next;
}else{
$curr = $curr->next;
}
}
// 最后还是能用head获取最终的链表
return $head;
}
}
本文介绍了一种算法,用于删除给定排序链表中的所有重复元素,确保每个元素只出现一次。通过实例展示了输入输出变化,并提供了PHP实现代码。

2553

被折叠的 条评论
为什么被折叠?



