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     }

 

posted on 2018-03-29 22:39  萌萌哒的陈C酱  阅读(140)  评论(0编辑  收藏  举报

导航