美文网首页
82. Remove Duplicates from Sorte

82. Remove Duplicates from Sorte

作者: sarto | 来源:发表于2022-04-24 09:56 被阅读0次

题目

给定一个排序链表的头 head,删除所有的重复数字,只保留不重复的数字。

image.png

解析

和前一个问题不同,前一个问题是无论如何保留一个数字,而这个问题是对于任何重复的数字均不保留。区别在于,前一个问题可以先append元素,判断后一个与前一个是否重复。而当前问题不能先append元素,因为该元素是否能被append,需要后一个元素进行判断。
对于链表问题,一般建议设置一个空头 head,对于这个问题,设置一个状态 f,标志该元素是否第一次出现。然后进行链表便利。

  1. 将第一个元素放到空头里,设置状态 f 为 true
  2. 往后便利,如果遇到相同的元素,f 修改状态为 false
  3. 如果遇到不同的元素,判断 f 状态
  4. 如果 f 为 true,追加链表为 空头 的值
  5. 如果 f 为 false,不操作
  6. 修改 空头 值为当前元素
  7. 便利完成后,判断 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
}
image.png

后记

  1. 逻辑,伪代码,代码,其实现思路都不太一样
  2. 代码在实现时,仅当发生不一样的值时,才决定尾指针的走向

相关文章

网友评论

      本文标题:82. Remove Duplicates from Sorte

      本文链接:https://www.haomeiwen.com/subject/sextyrtx.html