您的位置:首页 > 其它

有序链表删除重复元素

2015-03-23 10:14 405 查看
从有序链表中删除重复元素,每种剩下一个。1->1->2->2->3->4->4;===>1->2->3->4

两个游标p,q走。p为标杆值,若q的值等于p时,p继续走,不等于时,就将p的下一个置为q。

public ListNode deleteDuplicates(ListNode head){
if(head != null){
ListNode p = head, q = head;
for( ; q != null;q = q.next){
if(p.val != q.val){
p.next = q;
p = q;
}
}
p.next = null; //结尾,容易遗忘
}
return head;
}


相关题目:从有序数组中去除重复元素

public int removeDuplicates(int[] A){
if(A == null || A.length == 0) return 0;
int p = 0, q = 0;
for(; q < A.length; q++)
if(A[p] != A[q]) A[++p] = A[q];
return p+1;
}


从有序链表中删除重复元素,若有重复全部删除。1->1->2->2->3->4->4;===>3

不同点在于要保留一个前指针,删除前指针到q中间的所有元素。判断标杆值与q值不等时要考虑q是否是p的下一个节点。

public ListNode deleteDuplicates(ListNode head) {
if(head != null){
ListNode p = head, q = head,pre = null;
for( ; q != null; q = q.next){
if(p.val != q.val){
if(p.next != q){
p = q;
if(pre == null) head = p;
else pre.next = q;
}else{
pre = p;
p = q;
}

}
}
if(p.next != q){
if(pre == null) head = null;
else pre.next = q;
}//结尾,容易错!!!!
}
return head;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: