题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目链接:
分析:
三个指针。分别指向,新链表尾部,判断节点(这个节点直到指向下一个不重复的节点),遍历节点。
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode deleteDuplication(ListNode pHead) { //head记录新的头结点 ListNode head = null; //记录新链表的尾节点 ListNode pre = null; //判断节点,比如:指向pre节点的下一个节点。 ListNode pos = null; //遍历节点,直到找到与pos节点不同的节点 ListNode cur = pHead; while(cur != null){ //初次进来 if(pos == null){ pos = cur; } //相等的话遍历节点直接跳到下一个 if(pos.val == cur .val){ cur = cur.next; continue; } //到这一定满足pos.val != cur.val。同时说明pos节点不重复 if(pos.next == cur){ //记录下新链表的头部 if(head == null){ head = pos; } //更新新链表的尾部 if(pre == null){ pre = pos; }else{ pre.next = pos; pre = pos; } } //pos 指向遍历节点,遍历节点继续往下走 pos = cur; cur = cur.next; } //处理尾部节点,旧链表尾部节点也是一个不重复的节点 if(pos != null && pos.next == null){ if(pre == null){ head = pos; }else{ pre.next = pos; } }else{ //当链表全部重复或者链表为空链表时,更新新链表的尾部 if(pre == null){ head = null; }else{ pre.next = null; } } return head; } }
方法二:
建一个头部节点,来解决一个从头部节点重复的情况。
大体流程:当遇到当前节点的值与下一个节点的值相等时,直到找到下一个节点不同的值或者null,将新链表尾节点指向这个不同的节点或null。
当不相等时,新链表尾节点移动到下一个节点。
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode deleteDuplication(ListNode pHead) { ListNode head = new ListNode(0); head.next = pHead; ListNode pre = head;; ListNode cur = pHead; while(cur != null){ //下一个节点非null,且下一个节点与当前节点值相等 if(cur.next != null && cur.val == cur.next.val){ //直到找到下一个节点与当前节点与下一个节点不相等 while(cur.next != null && cur.val == cur.next.val){ cur = cur.next; } //指向下一个节点 cur = cur.next; //pre的next设置为下一个节点(下一个节点可能为null,处理尾部情况) pre.next = cur; }else{ //当前节点的值与下一个节点的值不相等,pre向下移动一个 pre = pre.next; cur = cur.next; } } return head.next; } }