跟小刀学习 java 数据结构 单向链表

来源:互联网 发布:linux 卸载squid 编辑:程序博客网 时间:2024/04/30 15:20
  • 这次我写java数据结构的单向链表,
  • 转载:请注明出处
    什么是单向链表呢?从字面的意思来说它是有方向的,只有一个方向,链表这种数据结构,表示它是一种链式的存储结构,它在物理内存中不是连续的,而是通过一个一个的指针指向下一个节点,最后一个元素的next指针域指向NULL,即为空,它表示链表的末尾元素,链表的第一个元素称为“头”元素。
    这里写图片描述

  • 单向链表的添加时是从头结点开始添加

  • 这里写图片描述
  • 单向链表的删除也是从头结点开始删除,当然也可以删除想删除的数据
  • 单向链表的 查询是,是从头结点开始查询,如果不是就找下一个节点.一直到找到为止
  • 所以可以这个总结,单向链接的添加和删除比较快,但是在查询上效率比较低,好了废话不多说直接上代码
先一写一个节点类public class Link {    public int iData;    public double dData;    public Link(int id, double dd) {        this.iData =id;        this.dData =dd;    }    public Link next;//指向下一个    public void display(){        System.out.print("["+iData+","+dData+"] ");    }}
这里写链表 public class LinkList {    private Link first;    public LinkList() {        this.first = null;    }    /**     * 添加第一个元素,从头结点开始添加     * @param id     * @param dd     */    public void insertFirst(int id,double dd){        Link newLink = new Link(id,dd);//创建一个link实例        newLink.next=first;// 新的节点的next 指向原来的第一个节点        first = newLink;//第一个节点变成新添加的    }    public Link  find(int key){        Link current = first;        while(current.iData !=key){//如果当前的idata不等于这个key 就继续找。            if(current.next !=null){//下一个不等于空 那就把下一个变成当前的                current=current.next;            }else                 return null;        }        return current;    }    /**     * 删除 一个元素     * @param key     * @return     */    public Link delete(int key){        Link current = first;        Link previous = first;        while(current.iData != key){            if(current.next == null) return null;//下一个为空,返回null            else                //这里比较绕口。就是说。下一个不为空 就当前的变成前一个,当前的下一个节点变成前一个                previous = current;                current = current.next;        }        //如果要删的找个元素就是第一个的话        if(current == first){            first = first.next;        }else{            //如果要删除的元素不是第一个的话就把前一个的指针指向当前的指针指向的那个 1--2--3              //就是1指向3            previous.next=current.next;        }        return current;    }    /**     * 从第一个节点开始删除     * @return     */    public Link deleteFirst(){        Link temp =first;        first=first.next;        return temp;    }    public boolean isEmpty(){        return first == null;    }    public void displayList(){        System.out.print("(first-->last):");        Link current = first;        while(current != null){            current.display();            current=current.next;        }        System.out.println();    }}

有俩个测试类我也献上代码
public class TestLinkList {

public static void main(String[] args) {    LinkList linkList = new LinkList();    linkList.insertFirst(88, 0.89);    linkList.insertFirst(23, 0.12);    linkList.insertFirst(34, 0.23);    linkList.insertFirst(17, 0.77);    linkList.insertFirst(33, 0.45);    linkList.displayList();    while(!linkList.isEmpty()){        Link deleteFirst = linkList.deleteFirst();        System.out.print("Delete");        deleteFirst.display();        System.out.println();    }    linkList.displayList();}

}

测试查询和删除你想删的数据

public static void main(String[] args) {
LinkList linkList = new LinkList();
linkList.insertFirst(88, 0.89);
linkList.insertFirst(23, 0.12);
linkList.insertFirst(34, 0.23);
linkList.insertFirst(17, 0.77);
linkList.insertFirst(33, 0.45);
linkList.displayList();

    Link find = linkList.find(34);    if(find == null)        System.out.println("can't fount key");    else        System.out.println("fount link with key :"+ find.iData);    Link delete = linkList.delete(23);    if(find == null)        System.out.println("can't delete key");    else        System.out.println("delete link with key :"+ delete.iData);    linkList.displayList(); }

“`
上述就是单向链表的java实现.如果有不对的地方,我们可以多多交流
—小刀

1 0
原创粉丝点击