删除有序链表中重复的元素-I:http://t.csdn.cn/IZXJm
题意:
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.数据范围:链表长度 0 \le n \le 100000≤n≤10000,链表中的值满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
示例:
输入:
{1,2,2}返回值:
{1}
题解:由于需要删除所有重复节点,包括第一个出现的节点,所以引入新节点作为头节点,
对于每个节点i,往后遍历找到与节点i不相等的节点j,通过判断节点i,j位置看i节点是否重复,如果重复,i节点的上一个节点pre直接指向j节点,舍弃掉重复节点。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
ListNode pre=null,h=null,t=null,next=null;
t=new ListNode(-1);
t.next=head;
pre=t;
h=head;
while(head!=null)
{
next=head.next;
while(next!=null&&next.val==head.val)
{
next=next.next;
}
if(head.next==next)
{
pre=head;
head=head.next;
}
else {
pre.next=next;
head=next;
}
}
h=t.next;
return h;
}
}