从排序列表中删除重复项

时间:2016-07-16 03:50:55

标签: java algorithm

例如:

  • 给定1→1→2,返回1→2。
  • 给定1→1→2→3→3,返回1→2→3。

我的问题是为什么返回的对象是head而不是node?为什么node.next表示节点遍历移动到下一个节点?我很困惑:

public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null)
            return null;
        ListNode node = head;
        while(node.next != null) {
            if(node.val == node.next.val) {
                node.next = node.next.next;
            } else {
                node = node.next;

            }
        }
        return head;
    }
}

2 个答案:

答案 0 :(得分:2)

为了帮助理解,我会在字母后面添加字母以查看不同的实例,例如:如果原始列表是1→1→1→2→2→3→3,那么将是1a→1b→1c→2a→2b→3a→3b

目标是删除重复项,并按如下方式进行:

从头开始:node = head

↓
1a→1b→1c→2a→2b→3a→3b

删除1b:node.next = node.next.next

↓
1a→1c→2a→2b→3a→3b

删除1c:node.next = node.next.next

↓
1a→2a→2b→3a→3b

前进:node = node.next

   ↓
1a→2a→2b→3a→3b

删除2b:node.next = node.next.next

   ↓
1a→2a→3a→3b

前进:node = node.next

      ↓
1a→2a→3a→3b

删除3b:node.next = node.next.next

      ↓
1a→2a→3a

退出循环:node.next != null
返回更新列表:head

↓
1a→2a→3a

正如您所看到的那样,node.next = node.next.next实际上并没有让您前进,但是为了让您向目标前进一步。

您必须返回head,否则您只需返回最后一个节点,即

↓
3a

你并不想要那个。

答案 1 :(得分:0)

该函数返回一个列表;列表由头节点表示。至于关于node.next的一点:因为这是它的目的。