链表

2017-09-13  本文已影响0人  shenlong77
节点类

除双向链表外的节点类

/*
 * 节点类
 * params:指向下一个节点的成员变量
 *        其他的成员变量
 */
public class Link {
    public int num;
    public Link next;
    public Link(int num){
        this.num=num;
    }
}

双向链表的节点类

/*
 * 双向链表的节点类
 */
public class Link {
    public int num;
    public Link next;
    public Link previous;
    public Link(int num){
        this.num=num;
    }
}

单链表

每个节点只指向下一个节点
单链表的操作类

/*
 * 单链表的操作类
 */
public class SingleList {
    //头节点
    public Link first;
    //在链表的头部插入一个元素
    public void insertFirst(int num){
        Link link=new Link(num);
        link.next=first;
        first=link;
    }
    //在链表的头部删除一个元素
    public Link deleteFirst(){
        if(first==null){
            return null;
        }
        Link temp=first;
        first=first.next;
        return temp;
    }
    //遍历显示链表中的所有元素
    public void display(){
        Link current=first;
        while(current!=null){
            System.out.println(current.num+",");
            current=current.next;
        }
    }
    //根据变量查询指定元素节点
    public Link find(int num){
        Link current=first;
        while(current.num!=num){
            if(current.next==null){
                return null;
            }else{
                current=current.next;
            }
        }
        return current;
    }
    //根据指定变量删除节点
    public Link delete(int num){
        Link current=first;
        Link previous=null;
        while(current.num!=num){
            if(current.next==null){
                return null;
            }else{
                previous=current;
                current=current.next;
            }
        }
        if(current==first){
            first=first.next;
        }else{
            previous.next=current.next;
        }
        return current;
    }
}
双端链表

每个节点指向下一个节点,在链表的操作类中同时保留着对头结点和尾节点的引用

/*
 * 双端链表的操作类
 */
public class FirstLastList {
    public Link first;
    public Link last;
    //在头部插入一个节点
    public void insertFirst(int num){
        Link link=new Link(num);
        if(first==null){
            last=link;
        }
        link.next=first;
        first=link;
    }
    //在尾部插入一个节点
    public void insertLast(int num){
        Link link=new Link(num);
        if(first==null){
            first=link;
        }else{
            last.next=link;
        }
        last=link;
    }
    //在头部删除一个节点
    public Link deleteFirst(){
        if(first==null){
            return null;
        }
        Link temp=first;
        //判断删除这个节点后是否没有节点了,如果没有节点要把last置为null
        if(first.next==null){
            last=null;
        }
        first=first.next;
        return temp;
    }
    //遍历显示节点
    public void display(){
        Link current=first;
        while(current!=null){
            System.out.println(current.num);
            current=current.next;
        }
    }
}

1.双端链表不能直接从尾部删除元素,因为无法直接找到尾部前一个节点的引用。
2.双端链表按元素查找和删除节点的操作和单链表相同。

双向链表

1 双向链表,每一个节点即指向前一个节点,同时又指向下一个节点。
2 双向链表可以是双端链表也可以不是双端链表。

/*
 * 双向链表的操作类
 */
public class DoubleLinkList {
    public Link first;
    public Link last;
    //在头部插入一个节点
    public void insertFirst(int num){
        Link newLink=new Link(num);
        if(first==null){
            last=newLink;
        }else{
            first.previous=newLink;
        }
        newLink.next=first;
        first=newLink;
    }
    //在尾部插入一个节点
    public void insertLast(int num){
        Link newLink=new Link(num);
        if(first==null){
            first=newLink;
        }else{
            last.next=newLink;
            newLink.previous=last;
        }
        last=newLink;
    }
    //在某一个节点后面插入一个节点
    public void  insertAfter(int num,int targetNum){
        Link target=new Link(targetNum);
        Link current=find(num);
        if(current==null)
            return;
        if (current==last) {
            current.next=target;
            target.previous=current;
            last=target;
        }else{
            target.next=current.next;
            current.next.previous=target;
            current.next=target;
            target.previous=current;
        }
    }
    //删除第一个节点
    public Link deleteFirst(){
        if(first==null)
            return null;
        if(first.next==null){
            last=null;
        }else{
            first.next.previous=null;
        }
        Link temp=first;
        first=first.next;
        return temp;
    }
    //删除最后一个节点
    public Link deleteLast(){
        if(last==null){
            return null;
        }
        Link temp=last;
        if(last.previous==null){
            first=null;
        }else{
            last.previous.next=null;
        }
        last=last.previous;
        return temp;
    }
    //查询某一个节点
    public Link find(int num){
        Link current=first;
        while(current.num!=num){
            if(current.next==null){
                return null;
            }
            current=current.next;
        }
        return current;
    }
    //删除某一个节点
    public Link delete(int num){
        Link current=first;
        while(current.num!=num){
            if(current.next==null){
                return null;
            }
            current=current.next;
        }
        if(current==first){
            first.next.previous=null;
            first=current.next;
        }else if(current==last){
            current.previous.next=null;
            last=current.previous;
        }
        else{
            current.previous.next=current.next;
            current.next.previous=current.previous;
        }
        return current;
    }
    //从前向后遍历所有节点
    public void displayForward(){
        Link current=first;
        while(current!=null){
            System.out.println(current.num);
            current=current.next;
        }
    }
    //从后向前遍历所有节点
    public void displayBackword(){
        Link current=last;
        while(current!=null){
            System.out.println(current.num);
            current=current.previous;
        }
    }
}
有序链表
/*
 * 有序链表操作类
 */
public class SortedList {
    public Link first;
    //按从小到大的顺序向链表中插入元素
    public void insert(int num){
        Link link=new Link(num);
        Link current=first;
        Link previous=null;
        while(current!=null&&num>current.num){
            previous=current;
            current=current.next;
        }
        //previous==null说明没进循环,first为null或者插入的元素是目前最小的
        if(previous==null){
            first=link;
        }else{
            previous.next=link;
        }
        link.next=current;
    }
}

有序链表除了插入操作外,其他操作和单链表一致。

上一篇 下一篇

猜你喜欢

热点阅读