给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
思路:
一开始想到的用类似数组中删除重复元素的方法,用快慢指针。实际上链表一次遍历即可。
这题主要考查的是对链表节点的操作能力,有几点特别需要注意:
0、需要定义一个新的节点用来遍历,存储原链表的头节点,不然最终无法返回链表的头节点 1、如果出现重复元素,是给$node->next的赋值。 2、删除的节点如何回收内存呢 3、PHP对象是引用传值。参考<a href="https://segmentfault.com/q/1010000010641993" rel="noopener" target="_blank">这里</a>。
算法:
0、定义一个指针指向链表头节点。 1、遍历链表。直到当前节点为空,或者当前节点的next为空就截止。 2、如果当前节点的值跟下一个节点的值相等,当前节点的next指向next节点的next。$node->next = $node->next->next; 3、如果当前节点的值跟下一个节点的值不相等,指针指向下一个节点。$node = $node->next; 4、返回头节点。
PHP实现
class ListNode { public $val = 0; public $next = null; function __construct($val) { $this->val = $val; } } class Solution { /** * @param ListNode $head * @return ListNode */ function deleteDuplicates($head) { $node = $head; while ($node != null && $node->next != null) { if ($node->val != $node->next->val) { $node = $node->next; } else { // 注意这里是给$node->next赋值 $node->next = $node->next->next; } } return $head; } }
时间复杂度:O(n)
参考:
维基百科:单向链表