1. 程式人生 > 實用技巧 >java-單鏈表

java-單鏈表

Node 類:

public class Node {
    public int data;
    public Node next=null;
    public Node(){
        data=2147483647;
        next=null;
    }
    //建構函式
    public Node(int data){
        this.data=data;
    }

}

MyLinkedList類

//連結串列操作

//1-基礎
//是否空
//連結串列長度-用成員變量表示,增刪操作同步(效果同調用函式遍歷)

//2-操作
//新增節點-末尾
//插入節點-索引
//根據索引刪除節點 //根據值-刪除節點(所有) //根據值-刪除重複節點(除了第一個所有) //根據值-刪除節點(第一個) //更新節點 //清空連結串列 //3-查詢 //表中是否存在某值 //根據索引獲取某一節點值 //根據值獲取節點索引[陣列] //根據值獲取第一個節點索引 //4-遍歷 //正向遍歷 //反轉連結串列 //反向遍歷 //5-判斷 //建立有環連結串列 //是否有環 //去除重複元素, //連結串列排序 import java.util.ArrayList; public class MyLinkedList { private int length=0; private Node head=new Node();
//建構函式預設就行,建立再新增節點 //是否空 public boolean isEmpty(){ if(this.length==0) return true; else return false; } //新增節點-末尾 public void add(int data){ Node newNode=new Node(data); Node p=this.head; //空表 if(length==0){ head.next
=newNode; } //非空表 else{ //遍歷至連結串列尾部 while(p.next!=null) p=p.next; p.next=newNode; } this.length++; } //插入節點-索引 [1-length+1] public void insert(int index,int data){ Node p=this.head; Node newNode=new Node(data); //插入位置保錯 if(index<1||index>length+1){ System.out.println("插入位置出錯"); } //插在末尾 else if(index==length+1){ this.add(data); } //插在表頭 else if(index==1){ newNode.next=head.next; head.next=newNode; length++; } else{ //遍歷到插入位置前 for(int i=0;i<index-1;i++){ p=p.next; } newNode.next=p.next; p.next=newNode; length++; } } //根據索引刪除節點 public void delete(int index){ if(!isEmpty()){ //插入位置保錯 if(index<1||index>length){ System.out.println("刪除位置出錯"); } //刪除頭節點 else if(index==1){ Node p=head.next; head.next=p.next; length--; } else{ //遍歷至待刪節點前 Node p=head; for(int i=0;i<index-1;i++){ p=p.next; } Node dp=p.next; p.next=dp.next; length--; } } else System.out.println("連結串列空,無法進行刪除操作"); } //根據值-刪除節點(所有) public void deleteall(int data){ ArrayList<Integer> indexs=getAllIndex(data); if(indexs.size()==0){ return; }else{ //從後往前刪除,不用變index; for(int i=indexs.size()-1;i>=0;i--){ delete(indexs.get(i)); } } }//根據值-刪除重複節點(除了第一個所有) public void deletellARepeat(int data){ ArrayList<Integer> indexs=getAllIndex(data); if(indexs.size()==0){ return; }else{ //從後往前刪除,不用變index;留下index[0]即可 for(int i=indexs.size()-1;i>=1;i--){ delete(indexs.get(i)); } } } //根據值-刪除節點(第一個) public void deletefirst(int data){ int index=getFirstIndex(data); if(index==-1){ return; }else{ delete(index); } } //更新節點 public void update(int index,int data){ if(!isEmpty()){ //更新位置保錯 if(index<1||index>length){ System.out.println("更新位置出錯"); } else if(index==1){ head.next.data=data; } else{ //遍歷至更新節點 Node p=head; for(int i=0;i<index;i++){ p=p.next; } p.data=data; } }else System.out.println("連結串列空,無法進行更新操作"); } //清空連結串列 public void clear(){ head.next=null; length=0; } //表中是否存在某值 public boolean isHave(int data){ if(!isEmpty()){ Node p=head; while(p.next!=null){ p=p.next; if(p.data==data) return true; } return false; }else{ System.out.println("連結串列空,無資料"); return false; } } //根據索引獲取某一節點值 public int getData(int index){ if(!isEmpty()){ if(index<1||index>length){ System.out.println("index出錯"); return -1; } else if(index==1){ return head.next.data; } else{ //遍歷至待刪節點前 Node p=head; for(int i=0;i<index;i++){ p=p.next; } return p.data; } }else{ System.out.println("連結串列空,無資料"); return -1; } } //根據值獲取節點索引[陣列] public ArrayList<Integer> getAllIndex(int data){ ArrayList<Integer> indexs=new ArrayList<Integer>(); if(isHave(data)){ Node p=head; int i=0; while(p.next!=null){ p=p.next; i++; if(p.data==data) indexs.add(i); } return indexs; }else { System.out.println("連結串列無此資料"); ArrayList<Integer> in=new ArrayList<Integer>(); return in; } } //根據值獲取第一個節點索引 public int getFirstIndex(int data){ if(isHave(data)){ //遍歷到節點 Node p=head; int i=0; while(p.next!=null){ p=p.next; i++; if(p.data==data) break; } return i; }else { System.out.println("連結串列無此資料"); return -1; } } //正向遍歷 public void print_1(){ if(!isEmpty()){ System.out.print("連結串列為:"); Node p=head; while(p.next!=null){ p=p.next; System.out.print(p.data+"->"); } System.out.println("null"); }else System.out.println("連結串列空,無資料,無輸出"); } //反轉連結串列 public MyLinkedList reverse(MyLinkedList myLinkedList){ if(!isEmpty()){ if(length==1) return myLinkedList; else{ Node curNode=head.next; Node preNode=null; while(curNode!=null){ Node nextNode=curNode.next; curNode.next=preNode; preNode=curNode; curNode=nextNode; } head.next=preNode; return myLinkedList; } }else{ System.out.println("連結串列空,無法反轉"); MyLinkedList mylist=new MyLinkedList(); return mylist; } } //反向遍歷 //反轉-正向遍歷 //正向遍歷,入棧-出棧 public void print_2(){ if(!isEmpty()){ MyLinkedList mylist1=reverse(this); MyLinkedList mylist=reverse(mylist1); System.out.print("反轉"); mylist.print_1(); }else System.out.println("連結串列空,無資料,無輸出"); } //建立有環連結串列 //將最後一個節點next指向前一個 public void toRinged(){ Node curNode=head; Node nextNode=curNode.next; while(curNode.next!=null&&curNode.next.next!=null){ curNode=nextNode; nextNode=nextNode.next; } nextNode.next=curNode; } //是否有環 //判斷連結串列是否有環: //設定快指標和慢指標,慢指標每次走一步,快指標每次走兩步 //當快指標與慢指標相等時,就說明該連結串列有環 public boolean isRinged(){ if(!isEmpty()){ if(length==1){ System.out.println("連結串列長度=1,無環"); return false; }else{ Node slow=head; Node fast=head; while(fast.next!=null&&fast.next.next!=null){ slow=slow.next; fast=fast.next.next; if(fast==slow) return true; } return false; } }else{ System.out.println("連結串列空,無環"); return false; } } //去除重複元素 public void deleteRepeatData(){ if(length<2){ System.out.println("連結串列長度<2,無重複資料"); }else{ MyLinkedList mylist=new MyLinkedList(); Node p=head.next; //將原連結串列中無重複資料新增到新連結串列; mylist.add(p.data); while(p.next!=null){ p=p.next; //System.out.print(p.data+" "+!mylist.isHave(p.data)+ " "); if(!mylist.isHave(p.data)) mylist.add(p.data); } //對新連結串列的每一個data執行this(原連結串列).deleteAllRepeat(data) Node p1=mylist.head; while(p1.next!=null){ p1=p1.next; //System.out.print(p1.data+" " ); this.deletellARepeat(p1.data); } } } //排序-冒泡 //交換函式 public void swip(Node p1,Node p2){ int a=p1.data; p1.data=p2.data; p2.data=a; } public void bubbleSort(){ if(length<2){ System.out.println("連結串列長度<2,無法排序"); }else { for(int i=1;i<length;i++){ //第一個迴圈,先遍歷到未排序序列首部 Node p=head; for(int j=0;j<i;j++){ p=p.next; } //第二個迴圈比大小,交換,將最大值上浮至末尾 Node curNode=p; Node nextNode=curNode.next; if(curNode.data>nextNode.data) swip(curNode,nextNode); while(curNode.next!=null&&curNode.next.next!=null){ curNode=nextNode; nextNode=nextNode.next; if(curNode.data>nextNode.data) swip(curNode,nextNode); } //將末尾最大值放到本層迴圈挑出來的,未排序的首部,下層未排序首部加1 swip(p,nextNode); } } } }
View Code

驗證類-test

public class linkedListTest {
    public static void main(String args[]) {
        //空?新增,正反遍歷
        MyLinkedList mylist=new MyLinkedList();
        System.out.println("isEmpty: "+mylist.isEmpty());
        mylist.add(6);
        mylist.add(5);
        mylist.add(4);
        mylist.add(3);
        System.out.println("isEmpty: "+mylist.isEmpty());
        mylist.print_1();
        mylist.print_2();
        //插入
        mylist.insert(1,14);
        mylist.print_1();
        mylist.insert(3,14);
        mylist.print_1();
        mylist.insert(17,14);
        mylist.print_1();
        //刪除
        mylist.delete(0);
        mylist.print_1();
        mylist.delete(4);
        mylist.print_1();
        mylist.delete(17);
        mylist.print_1();
        //刪除重複我-前提:獲取index陣列
        //mylist.deleteall(14);
       // mylist.deletellARepeat(14);
        mylist.deletefirst(14);
        mylist.print_1();

        //更新
        mylist.update(2,144);
        mylist.print_1();
        mylist.update(0,144);
        mylist.print_1();
        mylist.update(17,144);
        mylist.print_1();
        //清空
        //mylist.clear();
       // mylist.print_1();

        //get
        System.out.println(mylist.getData(0));
        System.out.println(mylist.getData(3));
        System.out.println(mylist.getData(17));
        //成環
//        mylist.toRinged();
//        System.out.println("isRinged: "+mylist.isRinged());
//        mylist.print_1();

        //去重複
        MyLinkedList mylist2=mylist;
        mylist2.add(6);
        mylist2.add(6);
        mylist2.add(17);
        mylist2.add(17);
        mylist2.add(8);
        mylist2.add(8);
        mylist2.print_1();

        mylist2.deleteRepeatData();
        mylist2.print_1();
        //排序
        mylist2.bubbleSort();
        mylist2.print_1();

    }
}
View Code