14. 删除链表中重复的节点(122)
-
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 -
思路:(1)新增一个节点作为有序链表的头结点。
(2)pre:指向要删除节点之间的前一节点。
(3)last:从链表的第一个节点开始遍历,然后从last开始往后找到最后一个和它相同的节点。
(4)如果
last.next != null && last.val == last.next.val
则继续往后找相同的节点。最后找到最后一个与之相同的节点之后,让:pre.next = last.next
,改变pre的后继节点,pre不动,last向后移last = last.next
如果后面没有与之相同的节点,则:
pre = pre.next
;last = last.next; pre、last向后移动。 -
代码
package _14.删除链表中重复的节点; public class DeleteRepeateNodeInList { // 删除有序链表中重复的节点 public ListNode deleteDuplication(ListNode pHead) { if(pHead == null || pHead.next == null){ return pHead; } //为链表再添加一个头结点 ListNode head = new ListNode(0); head.next = pHead; //前继节点 ListNode pre = head; //最后一个相同的节点 ListNode last = head.next; while(last != null){ if(last.next != null && last.val == last.next.val){ while(last.next != null && last.val == last.next.val){ last = last.next; } pre.next = last.next; last = last.next; }else{ pre = pre.next; last = last.next; } } return head.next; } public static void main(String[] args) { DeleteRepeateNodeInList list = new DeleteRepeateNodeInList(); ListNode head = new ListNode(0); ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(3); ListNode node3 = new ListNode(4); ListNode node4 = new ListNode(4); head.setNext(node1); node1.setNext(node2); node2.setNext(node3); node3.setNext(node4); ListNode node = list.deleteDuplication(head); System.out.println(node); } } class ListNode { int val; ListNode next; public ListNode(int val) { super(); this.val = val; } public void setNext(ListNode next) { this.next = next; } @Override public String toString() { return "ListNode [val=" + val + ", next=" + next + "]"; } }