一,問題描述
請自己構造一個簡單的有序單鏈表,然后實現刪除鏈表中的重復結點。比如:
二,問題分析
首先要實現一個單鏈表,因此需要定義一個節點類Node。其次,實現向鏈表中添加結點的方法(使用尾插法)addNode
刪除重復結點的實現思路:
定義兩個指針:pre 和 next。初始時,pre指向鏈表中的第一個元素,next指向鏈表中的第二個元素。如果 pre 的值與 next 的值不相等,則兩個指針分別都向后移一個結點;若相等,則刪除 next 指針指向的結點即可。
三,整個代碼實現
// delete duplicated nodes in increased list public class MyLinkedList { private class Node{ int ele; Node next; public Node(int ele) { this.ele = ele; next = null; } } private Node head; private Node tail; //采用尾插法添加結點 public void addNode(int ele){ Node newNode = new Node(ele); if(tail != null) tail.next = newNode; else{// first node head = newNode; } tail = newNode; } //刪除有序單鏈表中的重復結點 public void delDuplicatedNode(){ if(head == null) return; Node pre,next; pre = head; next = head.next; while(next != null) { if(pre.ele != next.ele) { pre = next; next = next.next; }else{//delete next point node Node delNode = next; pre.next = next.next; next = next.next; delNode.next = null;//avoid memory leak // delNode = null; } } } @Override public String toString() { if(head == null) return "null"; Node current = head; StringBuilder sb = new StringBuilder(); while(current != null){ sb.append(current.ele + " "); current = current.next; } return sb.toString(); } //hapjin test public static void main(String[] args) { MyLinkedList mylist = new MyLinkedList(); int[] eles = {1,2,3,3,4,4,5}; for (int ele : eles) { mylist.addNode(ele); } System.out.println("before del: " + mylist); mylist.delDuplicatedNode(); System.out.println("after del: " + mylist); } }