剑指Offer:删除链表的节点【18】
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目分析
如上图所示,我们的定义了三个指针,其中第二、三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素。
但是编码发现后,还有两种情况欠考虑。
这种情况,刚开始,就是重复,那第一个指针直接指向最后一个指针,所以返回的时候不能直接返回pHead了,因为那样子的话,就相当于没有删除。当然还有一种情况就是重复元素直接到最后一个元素
这时候我们需要处理一个边界问题,如果第三个指针的下一个为空,说明他已经是最后一个元素了,它与第二个指针之前的元素都是重复元素,都应该删除,所以我们直接让第一个指针指向空即可!
Java题解
package linklist; import java.util.Scanner; public class DeleteDuplication { public static void main(String[] args) { ListNode a1 = new ListNode(1); ListNode a2 = new ListNode(1); ListNode a3 = new ListNode(1); ListNode a4 = new ListNode(1); ListNode a5 = new ListNode(1); ListNode a6 = new ListNode(1); ListNode a7 = new ListNode(1); a1.next=a2; a2.next=a3; a3.next=a4; a4.next=a5; a5.next=a6; a6.next=a7; deleteDuplication(a1); } public static ListNode deleteDuplication(ListNode pHead) { if(pHead==null) return null; ListNode pA = new ListNode(0); pA.next = pHead; ListNode pB = pHead; ListNode pC =pHead.next; ListNode start = pA; while (pC!=null) { if(pC.val!=pB.val) { pA=pA.next; pB=pB.next; pC=pC.next; }else { while (pC!=null&&pC.val == pB.val) { pC = pC.next; //直到找到相等为止 } pA.next = pC; pB =pC; if(pC==null) break; pC=pC.next; } } start=start.next; while (start!=null) { System.out.println(start.val); start=start.next; } return null; } }