链表

来源:互联网 发布:uc2监控软件账号注册 编辑:程序博客网 时间:2024/06/06 02:24

链接点

链表由链接点对象构成,链接点对象中包含我们的数据,链接点通过节点实例相互关联。

通过上面图形,可以得到链表的基本条件,根节点,链接点对象,以及节点对象中包含的Data数据。

单链表:只有链表头first,每个链节点只有向后next的引用或者向前previous的引用

单链表的基本操作

1、链表头插入一个数据  insertFirst(Link link)


        

Link newLink = new Link();

newLink.next = first;

first = newLink;

2、在链表头删除一个数据 deleteFirst()


Link temp = first;

first = first.next;

return temp;

3、遍历链表displayLinkedList()


4、find(String key) 循环遍历链表,查看数据中是否有key值,若没有则返回null

5、delete(String key)若找到key,则删除该节点。

java代码实现单链表

//链表,代码只是为了演示。public class LinkedList {    private Link first;             //链表必须有一个根节点存在,表示链表头    public LinkedList() {        first = null;    }    public void insertFirst(Link newLink) {        newLink.next = first;        first = newLink;    }    public Link deleteFirst() {         //存在数据的情况下        Link temp = first;        first = first.next;        return temp;    }    public Link find(String name) {      //通过名字查找        Link current = first;        while (first!=null && !current.data.getName().equals(name)) {            current = current.next;            if (current == null)                current = null;        }        return current;    }    public Link delete(String name) {   //删除指定名字的节点        Link current = first;        Link previous = first;        while (first!=null && !current.data.getName().equals(name)) {            previous = current;            current = current.next;            if (current == null)                current = null;        }        if (current ==first)            deleteFirst();        else            previous.next = current.next;        return current;    }    public void displayLinkedList() {        Link current = first;        while (current != null) {            current.displayLink(current);            current = current.next;        }    }    public boolean isEmpty() {        return first == null;    }    public void clear() {           //清空链表        first = null;    }        public static void main(String[] args) {        LinkedList list = new LinkedList();         //创建链表        list.insertFirst(new Link(new Data("张三","成都","22")));  //插入四条带数据的连接点        list.insertFirst(new Link(new Data("李四","上海","35")));        list.insertFirst(new Link(new Data("王五","北京","15")));        list.insertFirst(new Link(new Data("六六","西藏","27")));        list.displayLinkedList();                   //遍历该链表        /*            结果为:            Data{name='六六', address='西藏', age='27'}            Data{name='王五', address='北京', age='15'}            Data{name='李四', address='上海', age='35'}            Data{name='张三', address='成都', age='22'}         */        Link find = list.find("张三");        find.displayLink(find);                     //查找结果为:Data{name='张三', address='成都', age='22'}        Link delete = list.delete("六六");        delete.displayLink(delete);                 //Data{name='六六', address='西藏', age='27'}        list.displayLinkedList();        /*            结果为:            Data{name='王五', address='北京', age='15'}            Data{name='李四', address='上海', age='35'}            Data{name='张三', address='成都', age='22'}         */        Link link = list.deleteFirst();             //删除链表头的数据        link.displayLink(link);                     //结果为:Data{name='王五', address='北京', age='15'}    }}//创建链接点对象class Link {    public Data data;    public Link next;    public Link(Data data) {        this.data = data;        next = null;    }    public void displayLink(Link link) {        System.out.println(link.data);    }}//创建类封装我们的数据class Data {    private String name;    private String address;    private String age;    public Data(String name, String address, String age) {        this.name = name;        this.address = address;        this.age = age;    }    public String getName() {        return name;    }    @Override    public String toString() {        return "Data{" +                "name='" + name + '\'' +                ", address='" + address + '\'' +                ", age='" + age + '\'' +                '}';    }}

双向链表


双向链表不同的地方在于,根节点包含first和last两个引用,既可以向前遍历,也可以向后

遍历。因此,每个链接点中除了data数据外,还应该包含向前或者向后的引用。

双向链表的部分操作以及java代码实现。

public class DoubleLinkedList {    private Link first;                         //根节点链表头引用    private Link last;                          //根节点链表尾引用    public DoubleLinkedList() {                 //初始化        first = null;        last = null;    }    public void insertFirst(Link newLink) {        if (isEmpty()) {                        //如果链表为空            last = newLink;        } else {            first.prev = newLink;        }        newLink.next = first;                   //最后两个条件无论如何都要执行        first = newLink;    }    public void insertLast(Link newLink) {        if (isEmpty()) {            first = newLink;        } else {            newLink.prev = last;            last.next = newLink;        }        last = newLink;    }    public boolean insertAfter(int key) {        Link newLink = new Link(key);        Link current = first;        while (current.data != key) {            current = current.next;            if (current == null)                return false;        }        if (current == last) {            newLink.next = null;            last = newLink;        } else {            newLink.next = current.next;            current.next.prev = newLink;        }         current.next = newLink;        newLink.prev = current;        return true;    }    public boolean isEmpty() {        return first == null;    }}//创建节点,数据用data表示,包含向前或者向后的引用class Link {    public int data;    public Link prev;    public Link next;    public Link(int data) {        this.data = data;        prev = null;        next = null;    }}



原创粉丝点击