Java从链表中删除重复项

时间:2012-02-27 03:08:21

标签: java

我想从已排序的链接列表{0 1 2 2 3 3 4 5}中删除重复项。

`

public Node removeDuplicates(Node header)
{
    Node tempHeader = null;
    if(header != null) 
        tempHeader = header.next;
    else return header;
    Node prev = header;
    if((tempHeader == null)) return header ;

    while(tempHeader != null)
    {
        if(tempHeader.data != prev.data)
        {
            prev.setNext(tempHeader);
        }
    tempHeader = tempHeader.next;
    }
    prev = header;
    printList(prev);
    return tempHeader;
}

`

prev.setNext(tempHeader)在while循环中无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。

Printlist函数只接受标题指针并打印列表。

节点定义如下。

public class Node
{
    int data;
    Node next;

    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
}

5 个答案:

答案 0 :(得分:2)

循环已排序,因此您知道重复项将彼此相邻。如果你想编辑列表然后,你必须有两个列表指针(你这样做)。你称之为tempHeader和prev的那个,你必须在列表中将它们推进(我在代码中没有看到)。否则,如果你没有按照前进指针前进,那么你总是将tempHeader下的元素与列表中的第一个项目进行比较,这是不正确的。

然而,更简单的方法是随时建立一个新列表。只需记住您附加到列表中的最后一项的值。然后,如果你要插入的那个是相同的,那么就不要插入它,当你完成后,只需返回你的新列表。

答案 1 :(得分:1)

在这种情况下,不需要返回值。

public void removeDuplicates(Node list) {
    while (list != null) {
        // Walk to next unequal node:
        Node current = list.next;
        while (current != null && current.data.equals(list.data)) {
            current = current.next;
        }
        // Skip the equal nodes:
        list.next = current;
        // Take the next unequal node:
        list = current;

    }
}

答案 2 :(得分:1)

public ListNode removeDuplicateElements(ListNode head) {
  if (head == null || head.next == null) {
        return null;
    }
    if (head.data.equals(head.next.data)) {
        ListNode next_next = head.next.next;
        head.next = null;
        head.next = next_next;
        removeDuplicateElements(head);
    } else {
        removeDuplicateElements(head.next);
    }
    return head;
}

答案 3 :(得分:0)

我可以就上述建议给你2条建议 1)将链接列表转换为Set,这将消除重复和 从Set返回到Linked列表 完成此操作的代码将是

linkedList = new LinkedList<anything>(new HashSet<anything>(origList));

2)如果你不想要任何重复,你可以使用LinkedHashSet

答案 4 :(得分:0)

通过DoublyLinked List并使用HashSet,

with recursive s as (
      select s.id, s.name, s.timeint, count(*) as cnt,
             row_number() over (partition by id order by timeint) as seqnum
      from sample s
      group by s.id, s.name, s.timeint
     ),
     cte as (
      select id, timeint, name, seqnum, timeint as start_timeint, cnt
      from s
      where seqnum = 1
      union all
      select s.id, s.timeint, s.name, s.seqnum,
             (case when s.timeint <= cte.start_timeint + interval '1 second'
                   then cte.start_timeint else s.timeint
              end),
             s.cnt
      from cte join
           s
           on s.id = cte.id and s.seqnum = cte.seqnum + 1
     )
select  id, name, start_timeint, sum(cnt)
from cte
group by id, name, start_timeint
order by id, start_timeint;

doublylinkedList

  public static void deleteDups(Node n) {
    HashSet<Integer> set = new HashSet<Integer>();
    Node previous = null;
    while (n != null) {
        if (set.contains(n.data)) {
            previous.next = n.next;
        } else {
            set.add(n.data);
            previous = n;
        }
        n = n.next;
    }
}
相关问题