JAVA数据结构之链表
学过链表的都知道,链表并不是顺序存储
每个链表节点包括两部分
一个数据域,另一个是存放下一节点的地址,如果要查找某个元素,必须从第一个元素开始找。
想比于数组,链表的长度可变,,链表的查找较慢,但是删除和插入十分迅速。
直接上代码
创建链表
1 private int data; 2 private LinkList next; 3 /** 4 * 创建链表 5 * @param arr 6 * @return 7 */ 8 public LinkList creatList(int[] arr){ 9 LinkList head=new LinkList(); 10 LinkList tail=head; 11 tail.next=null; 12 13 for(int i=0;i<arr.length;i++){ 14 LinkList link_new=new LinkList(); 15 link_new.data=arr[i]; 16 tail.next=link_new; 17 link_new.next=null; 18 tail=link_new; 19 } 20 return head; 21 }
遍历链表
1 /** 2 * 显示链表 3 * @param link 4 */ 5 void printList(LinkList list){ 6 LinkList l=list.next; 7 8 for(int i=0;i<lenList(list) && l!=null;i++){ 9 if(i!=lenList(list)-1){ 10 System.out.print(l.data+" "); 11 } 12 else{ 13 System.out.print(l.data); 14 } 15 l=l.next; 16 } 17 System.out.println(); 18 }
判断链表是否为空
1 /** 2 * 判断链表是否为空 3 * @param link 4 * @return 5 */ 6 public boolean listEmpty(LinkList list){ 7 if(list.next==null){ 8 return true; 9 } 10 else{ 11 return false; 12 } 13 }
插入元素
1 /** 2 * 插入元素,在pos前插入 3 * @param list 4 * @param pos 5 * @param val 6 * @return 7 */ 8 public boolean insertList(LinkList list,int pos,int val){ 9 int i; 10 LinkList l=list; 11 for(i=0;i<pos-1 && l!=null;i++){ 12 l=l.next; 13 } 14 15 if(i>pos-1 || l==null){ 16 return false; 17 } 18 LinkList link_new=new LinkList(); 19 link_new.data=val; 20 LinkList q=l.next; 21 l.next=link_new; 22 link_new.next=q; 23 24 return true; 25 }
删除节点
1 /** 2 * 删除节点 3 * @param list 4 * @param pos 5 * @return 6 */ 7 public boolean deleteList(LinkList list,int pos){ 8 int i; 9 LinkList l=list; 10 for(i=0;i<pos-1 && l.next!=null;i++){ 11 l=l.next; 12 } 13 14 if(i>pos-1 || l==null){ 15 return false; 16 } 17 LinkList q=l.next; 18 //删除l后面的节点 19 l.next=l.next.next; 20 q=null; 21 return true; 22 }
链表排序
1 /** 2 * 链表选择排序 3 * @param list 4 */ 5 public void selectSortList(LinkList list){ 6 int i,j,temp; 7 LinkList p,q; 8 for(i=0,p=list.next;i<lenList(list)-1;i++,p=p.next){ 9 for(j=i+1,q=p.next;j<lenList(list);j++,q=q.next){ 10 if(p.data>q.data){ 11 swap(p,q); 12 } 13 } 14 } 15 }
1 /** 2 * 链表冒泡排序 3 * @param list 4 */ 5 public void BubbleSortList(LinkList list){ 6 int i,j; 7 LinkList p,q; 8 for(i=0,p=list.next;i<lenList(list)-1;i++,p=p.next){ 9 for(j=0,q=list.next;j<lenList(list)-1-i;j++,q=q.next){ 10 if(q.data>q.next.data){ 11 swap(q,q.next); 12 } 13 } 14 } 15 }
交换数据位置
/** * 交换两个元素位置 * @param vala * @param valb * @param temp */ private void swap(LinkList p,LinkList q){ int temp=p.data; p.data=q.data; q.data=temp; }
查找某个元素是第几个
1 public int searchList(LinkList list,int key){ 2 LinkList l=list.next; 3 for(int i=0;i<lenList(list);i++,l=l.next){ 4 if(l.data==key){ 5 return i+1; 6 } 7 } 8 return -1; 9 }