问题描述:
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2
, return 1->2
.
Given 1->1->2->3->3
, return 1->2->3
.
原问题链接:https://leetcode.com/problems/remove-duplicates-from-sorted-list/
问题分析
这个问题和之前讨论过的移除重复元素的问题很接近。它们有一个细微的差别就是在前一个问题中,对于有任何重复的元素,它们将不能包含在结果链表中,而这个是要求重复的元素有一个要包含在结果连表中。虽然有这么一个细微的差别,但是它们的基本解决思路还是很近似的。
我们通过一个临时的ListNode来保存指向head前一个元素,并将它设置为pre。然后将cur = head。这样每次根据cur.next != null的循环去判断cur.val == cur.next.val。如果不相等说明cur的下一个元素就要和当前元素不同了,那么需要将prev.next = cur。在退出循环后要将最后一个元素也链接到链表中来。
详细的代码实现如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) return head;
ListNode res = new ListNode(0);
res.next = head;
ListNode pre = res, cur = head;
while(cur.next != null) {
if(cur.val != cur.next.val) {
pre.next = cur;
pre = cur;
}
cur = cur.next;
}
pre.next = cur;
return res.next;
}
}