java-單鏈表
阿新 • • 發佈:2020-09-16
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-操作 //新增節點-末尾 //插入節點-索引View Code//根據索引刪除節點 //根據值-刪除節點(所有) //根據值-刪除重複節點(除了第一個所有) //根據值-刪除節點(第一個) //更新節點 //清空連結串列 //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); } } } }
驗證類-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