删除链表中重复的结点
删除链表中重复的结点
http://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
思想: **
** 1.pHead为null或者pHead.next==null,返回pHead。
* 2.否则,初始化pre和itr,pre指向pHead,pHead指向itr,以方便可以同时删除多个重复的节点(中间始终隔了一个节点),初始化flag标记itr前一个节点是否是重复节点。*
* 3.如果当前遍历节点和前面一个节点重复,标记位flag为true,当前节点itr后移,后移的同时判断是否到结尾,到结尾pre指向itr.*
* 4.如果遇到当前节点和前面不等,如果flag为true(前一节点是重复点),pre跳过前面 节点指向itr,itr后移。*
* 5.否则前面节点不是重复节点,pre后移,itr后移*
* 时间复杂度:O(N),空间复杂度O(1)*
//时间复杂度O(N),空间O(1) public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead==null||pHead.next==null) return pHead; ListNode pre_head = new ListNode(-1); pre_head.next=pHead; ListNode pre = pre_head; ListNode itr = pHead.next; boolean flag = false; while(itr!=null){ if(pre.next.val==itr.val){ flag=true; itr=itr.next; if(itr==null)//如果到最后,不加此语句,最后相同数的不会被消除 pre.next=itr; continue; } if(flag) pre.next=itr; else{ pre=pre.next; } itr=itr.next; flag=false;//上一段相同的结束 } // if(all)return null; return pre_head.next; } }