创建结点类,链表类,测试类
1 import java.lang.Object; 2 //结点node=数据date+指针pointer 3 public class Node { 4 Object iprop; 5 public Object getIprop(int i){ 6 switch(i){ 7 case 1:iprop=num;break; 8 case 2:iprop=name;break; 9 case 3:iprop=score;break;10 }11 return iprop;12 }13 //数据data14 Object num,name,score;15 //指针pointer16 Node next;17 public Node(Object obj1,Object obj2,Object obj3){18 num=obj1;19 name=obj2;20 score=obj3;21 }22 public Node(){23 24 }25 }
1 //链表List=头结点head+尾结点tail+链表名Lname 2 public class List { 3 4 // 头结点head 5 Node head; 6 // 尾结点tail 7 Node tail; 8 // 链表名Lname 9 String Lname; 10 int length=0; 11 12 // 初始化链表时,里面没有结点,为空链表 13 public List(String str) { 14 head = tail = null; 15 Lname = str; 16 } 17 18 public List() { 19 head = tail = null; 20 Lname = "List"; 21 } 22 23 // 头插法 24 public List appendToFront(Node n) { 25 26 if(this.head==null){ 27 head=tail=n; 28 length++; 29 //n.next=null; 30 }else{ 31 32 n.next=head; 33 head=n; 34 length++; 35 } 36 return this; 37 38 } 39 40 // 尾插法 41 public List appendToTail(Node n) { 42 // 43 if(head!=null){ 44 tail.next=n; 45 tail=n; 46 }else{ 47 head=tail=n; 48 //n.next=null; 49 } 50 return this; 51 52 } 53 54 // 插入结点到第i个结点之后 55 public void insert(Node n, int i) { 56 57 } 58 59 // 插入结点到第j个data为obj的结点之后 60 public void insert(Node n, Object obj, int i) { 61 62 } 63 64 // 遍历链表 65 public void visitAll() { 66 //创建pointer p 67 Node p=new Node(); 68 //拿到头结点的引用 69 p=head; 70 //顺序拿到结点做展示 71 for(;p!=null;){ 72 System.out.println("num:"+p.num+"name:"+p.name+"score:"+p.score); 73 p=p.next; 74 } 75 } 76 77 // 拿到第i个结点 78 public Node getNode(int i) { 79 //定义浏览指针p 80 Node p=new Node(); 81 82 //定义循环参数j 83 int j=1; 84 85 //循环结点 86 p=this.head; 87 if(p!=null) 88 for(;j >直接插入法130 public List listSort(int j){131 132 //循环当前链表的结点对象,找到第j个data值133 Node p=head;//想象head 下标为0,head.next依次类推134 int[] datas=new int[this.length];135 for(int i=0;p!=null;i++){136 Object prop=p.getIprop(j);//137 if(prop!=null){138 System.out.println("循环到下标为"+i+"的结点");139 datas[i]=Integer.parseInt(prop.toString());140 141 }142 p=p.next;143 }144 //冒泡排序145 Node pre=null;146 147 for(int i=0;idatas[k+1]){155 156 int temp=datas[k];157 datas[k]=datas[k+1];158 datas[k+1]=temp;159 160 161 Node tempNode=p.next.next;162 163 pre.next=p.next;164 p.next.next=p;165 p.next=tempNode;166 167 pre=pre.next;168 169 }else{170 //拿到前驱结点171 pre=p;172 p=p.next;173 }174 }175 }176 177 return this;178 }179 public static void main(String[] arg){180 int[] datas={4,2,5,6,7,3,1,0,9,8};181 //冒泡排序法182 for(int i=0;i datas[j+1]){185 int temp=datas[j];186 datas[j]=datas[j+1];187 datas[j+1]=temp;188 }189 }190 }191 for(int i=0;i
1 public class TestList { 2 public static void main(String[] arg){ 3 Node n0=new Node(125,"n0","91"); 4 Node n1=new Node(123,"n1","98"); 5 Node n2=new Node(121,"n2","99"); 6 Node n3=new Node(125,"n3","96"); 7 Node n4=new Node(125,"n4","95"); 8 Node n5=new Node(125,"n5","97"); 9 Node n6=new Node(125,"n6","93");10 Node n7=new Node(125,"n7","94");11 Node n8=new Node(125,"n8","92");12 Node n9=new Node(125,"n9","90");13 14 15 List f1=new List("f1List");16 //头插法17 f1.appendToFront(n0).appendToFront(n1).appendToFront(n2).appendToFront(n3)18 .appendToFront(n4).appendToFront(n5).appendToFront(n6).appendToFront(n7)19 .appendToFront(n8).appendToFront(n9);20 21 22 //拿到排好序的链表f2;23 f1.listSort(3).visitAll();24 25 26 27 28 }29 30 }
冒泡排序用处真大
心得:
>>对于指针(引用)的运用需要注意如下:
Node p=f1List.head;
p=p.next;//让指针直接指向(即直接p=)新引用对象(p.next),不会引起原被引用对象(head)的任何变化
Node p=f1List.head; p.next=p;//调用原被引用对象的属性后,将会引起原被引用对象(head)的属性相应的变化