链表

作者: shenlong77 | 来源:发表于2017-09-13 10:30 被阅读0次
节点类

除双向链表外的节点类

/*
 * 节点类
 * 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;
    }
}

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

相关文章

  • 链表基础

    链表基础 链表长度 链表为空 链表结构 链表增加

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 算法与数据结构:链表

    链表 链表还分为单向链表和双向链表, 但是这篇文章只说单向链表 , 下次再讲双向链表 . 链表和数组的区别 ? 链...

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 五、双向链表

    双向链表 此前介绍的链表,也叫做单向链表使用双向链表可以提升链表的综合性能 修改之前的单链表的源码: 双向链表 –...

  • 链表

    内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 表 双向链表 循环链表 链表数据结...

  • 数据与算法结构

    线性表 顺序表 链表(物理上离散,逻辑上连续) 链表的类别 单链表 循环链表 双链表 链表的操作 顺序表与链表的比...

  • 数据结构——链表

    本文所讲的链表是单链表,链表采用无头链表 科普下:一般链表可以分为有头节点的链表与无头节点的链表 有头节点的链表:...

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

网友评论

      本文标题:链表

      本文链接:https://www.haomeiwen.com/subject/xkiujxtx.html