本题主要是考链表的操作,对链表的熟悉度。存数据结构的内容
本题目的关键:题目中说到是排序数组,我们可以根据链表特点找到相等的这一串节点,我们只要2找到最后一个相等的节点就好了。直接把指针移到这个节点后面去,打完收工,不能一个一个的删,但是问题又来了,,,第一个节点和第二个节点相同怎么删啊,,,,构造一个假头贴上去。
本题的首先在链表上比较相邻的节点,一般的操作就是 p 与 p.next 比较,所以假如做一个链表的冒泡也是儒雅随和,不做删除。
但是关键点在于怎么删除节点,之前的题:如何在O(1) 时间内删除指定的链表节点,那里的思路还是比较巧妙的,但是我们这里用不到,我们是要删除相同的,假如 a=b=c,一个一个的删除的话总是有一个删不掉。
public ListNode deleteDuplication(ListNode pHead) { if(pHead==null){ return null; } ListNode p1=new listNode(0); p1.next=pHead; ListNode p2=pHead; ListNode p3=p1; while(p2!=null){ if(p2.val!==p2.next.val){ // 如果不等于,大家相安无事 p2=p2.next; p1=p1.next; }else { // 如果等于 while(p2.next!=null && p2.val==p2.next.val){ //这里做一个小循环移动,找到最后一个相等节点,但是这个节点也是要被删除的。 p2=p2.next; } p1.next=p2.next;//直接划走,本来这里是 p2 的,但是这个 p2 是最后一个相等的数字,也要被带走,所以 p1 直接指向p2 的 next,最后一个相等的数 p2 ***掉 p2=p2.next;//再移动一下p2,把 p2 移到p2.next 上去 //这两步后p1和p2 指向同一个地方,但是又是p2向后拓展。 } return p3.next; }