- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
- 82. Remove Duplicates from Sorte
题目
给定一个排序链表的头 head
,删除所有的重复数字,只保留不重复的数字。
![](https://img.haomeiwen.com/i22834193/327612666db518aa.png)
解析
和前一个问题不同,前一个问题是无论如何保留一个数字,而这个问题是对于任何重复的数字均不保留。区别在于,前一个问题可以先append元素,判断后一个与前一个是否重复。而当前问题不能先append元素,因为该元素是否能被append,需要后一个元素进行判断。
对于链表问题,一般建议设置一个空头 head,对于这个问题,设置一个状态 f,标志该元素是否第一次出现。然后进行链表便利。
- 将第一个元素放到空头里,设置状态 f 为 true
- 往后便利,如果遇到相同的元素,f 修改状态为 false
- 如果遇到不同的元素,判断 f 状态
- 如果 f 为 true,追加链表为 空头 的值
- 如果 f 为 false,不操作
- 修改 空头 值为当前元素
- 便利完成后,判断 f 状态,是否追加空头,然后截断链表。
伪代码
vhead.next = head
f = true
v = head.val
tail = vhead
cur = head.next
for cur != nil
if cur.val = v
f=false
tail.next = cur
continue
if f
tail=tail.next
if !f
tail.next=cur
v= cur.val
f = true
if f
tail.next = &node{v,nil}
else
tail.next = nil
代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil {
return nil
}
vhead := &ListNode{}
vhead.Next = head
v:=head.Val
f:=true
tail:=vhead
for cur:=head.Next; cur!=nil; cur=cur.Next {
if cur.Val == v {
f=false
continue
}
if f {
tail=tail.Next
}else {
tail.Next = cur
}
v=cur.Val
f=true
}
if f {
tail=tail.Next
}
tail.Next = nil
return vhead.Next
}
![](https://img.haomeiwen.com/i22834193/f39918e0297572c5.png)
后记
- 逻辑,伪代码,代码,其实现思路都不太一样
- 代码在实现时,仅当发生不一样的值时,才决定尾指针的走向
网友评论