Java数据结构—单链表

链表是一种数据结构,和数组同级。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。
单链表结构:
这里写图片描述

单链表就相当于从头结点开始,每一个节点只要记录下一节点,就把所有数据串了起来,形成了一个单向链表。 各个节点的储存可以是分散的。

头插法:
这里写图片描述

尾插法:
这里写图片描述

class TestLink{


    private Entry head;//指向头结点的引用

    public TestLink(){
        head = new Entry();
    }

    class Entry{//Entry  Node 
        int data;
        Entry next;

        public Entry(){
            data = -1;
            next = null;
        }

        public Entry(int val){
            data = val;
            next = null;
        }

    }


    public void insertHead(int val){//头插法
        //有这么一个结点  
        Entry cur = new Entry(val);//先创建要插入的结点
        cur.next = head.next;//使要插入的结点指向原来的第一个结点
        head.next = cur;//然后头结点指向要插入的结点

    }

    public void insertTail(int val){
        //找到尾巴
        Entry cur = head;
        while(cur.next != null){//当结点的地址域不为空时,让结点一直向后移动,知道找到地址域为null的结点,此时即是要找的链表的最后一个结点
            cur = cur.next;
        }
        Entry entry = new Entry(val);//创建要插入的结点
        cur.next = entry;//让最后一个阶段,指向要查入的结点
    }
    //得到单链表的长度:
    public int getLength(){
        int len = 0;
        Entry cur = head.next;
        while(cur != null){
            len++;
            cur = cur.next;
        }
        return len;
    }
    //将数据插入到指定位置
    public boolean insertPos(int val,int pos){//pos是插入的位置序号
        //1、判断pos的合法性
        if(pos < 0 || pos >= getLength()+1){
            return false;

        }
        Entry cur = head;
        for(int i = 0;i <= pos-1;i++){
            cur = cur.next;
        }
        //cur    pos的前一个
        Entry entry = new Entry(val);
        entry.next = cur.next;
        cur.next = entry;
        return true;

    }//show()
    public void show(){//单链表的遍历

        Entry cur = head.next;//获得了头结点
        while(cur != null){//如果结点的地址域不为null,输出这个结点。然后头结点一直向后移动,知道找到地址域为null的结点
            System.out.println("data:"+cur.data);
            cur = cur.next;
        }
    }


}

单链表的逆置

    public  void nizhi(){

        Entry cur = head.next;
        Entry   a = null;
        Entry   b = null  ;
        while(cur!=null){  
            a = cur.next;               
            cur.next = b;               
            b = cur;                     
            cur = a;                    
        }  
        head.next = b;
        }


求单链表倒数第k个结点

public void select(int k){
    int i;
    Entry cur=head;
    if(k>getLength()||k<0){//先判断k的值是否合法
        System.out.println("超出链表范围");
    }
    for( i=0;i<=getLength()-k;i++){//进行循环,直到结点移动到我们要求的结点

        cur=cur.next;

    }
    System.out.println(cur.data);//输出结点的值

}

}

猜你喜欢

转载自blog.csdn.net/qq_37232304/article/details/80082622
今日推荐