算法 删除排序链表中的重复元素

本文介绍了一种算法,用于删除给定排序链表中的所有重复元素,确保每个元素只出现一次。通过实例展示了输入输出变化,并提供了PHP实现代码。

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 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

  1. PHP链表结构

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被覆盖。
  1. 题目解法
/**
 * 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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值