zoukankan      html  css  js  c++  java
  • 自写一个双向链表

    package test;
    /**
    * 双向链表
    * @author 冷浪进
    *
    */
    public class MyLinkedList {
    //节点
    class Node{
    //指向向一节点
    Node pre;
    //指向下节点
    Node next;
    //节点的数据
    Object data;
    //两个构造方法
    public Node() { }
    public Node(Node pre,Node next,Object data) {
    this.pre = pre;
    this.next = next;
    this.data = data;
    }
    }
    //保存头结点
    Node head;
    //保存尾节点
    Node tail;
    //链表大小
    int size;

    /**
    * 获取链表大小
    * @return
    */
    public int size() {
    return size;
    }
    /**
    * 判断是否为空
    * @return
    */
    public boolean isEmpty() {
    return size==0;
    }
    //查看节点数据的索引
    public int indexOf(Object data) {
    Node node = head;
    for(int i=0; i<size&&node!=null; node=node.next,i++) {
    if(node.data == data) {
    return i;
    }
    }
    return -1;
    }
    //查看指定索引的数据
    private Node getNode(int index) {
    //索引不在0到size之间
    checkIndex(index);
    //判断index的值是否大于size的一半,再确定从head开始,还是从tail开始
    //size>>1 ===> size/2 size>>1效率高
    if(index <= size>>1) {
    Node node = head;
    for(int i=0; i<=size/2&&node!=null;node=node.next, i++) {
    if(i==index) {
    return node;
    }
    }
    }else {//如果index<size/2
    Node node = tail;
    for(int i=size-1; i>size/2&&node!=null;node=node.pre, i--) {
    if(i==index) {
    return node;
    }
    }
    }
    return null;
    }
    public Object getValue(int index) {
    return getNode(index).data;
    }
    private void checkIndex(int i) {
    if(i<0||i>size) {
    throw new RuntimeException("无效的索引");
    }
    }
    //在链表的尾端添加节点
    public void add(Object data) {
    //判断节点
    if(head==null) {
    head = new Node(null,null,data);
    //只有一个节点,tail和head都指向该节点
    tail = head;
    }else {
    //head不为空,创建一个新节点 ,作为最后一个节点
    Node newNode = new Node(tail,null,data);
    //首先最后一个节点指向新节点,然后再讲tail指向新节点
    tail.next = newNode;
    tail = newNode;
    }
    size++;
    }
    //在指定索引加节点
    public void add(int i,Object data) {
    //索引不在
    checkIndex(i);

    if(head==null) {
    head = new Node(null,null,data);

    }else {
    Node node = head;
    for(int j=0; j<size&&node!=null; node=node.next,j++) {
    if(i==j) {
    Node no = new Node(node.pre,node,data);
    node.pre.next = no;
    node.pre = no;
    }
    }
    }
    size++;
    }
    //删除最后一个节点
    public Object remove() {
    return remove(size-1);

    }
    //删除指定索引的节点
    public Object remove(int i) {
    //判断索引是否存在
    checkIndex(i);
    //获取索引为i的节点
    Node node = getNode(i);
    if(node.pre==null) {
    head = node.next;
    }else if(node.next==null) {
    tail = tail.pre;
    }else {
    node.pre.next = node.next;
    node.next.pre = node.pre;
    }
    size--;
    return node.data;
    }
    //判断是否包含key
    public boolean contains(Object key) {
    //直接判断可以的索引是否为-1,如果是-1不存在
    if(indexOf(key)==-1) {
    return false;
    }
    return true;
    }
    //用data替换i索引处的数据
    public void replace(int i,Object data) {
    //判断索引是否存在
    checkIndex(i);
    Node node = head;
    for(int j=0; j<size&&node!=null; node = node.next, j++) {
    if(i==j) {
    node.data = data;
    }
    }
    }
    @Override
    public String toString() {
    StringBuffer sb = new StringBuffer("[");
    Node node = head;
    for(int i=0; i<size&&node!=null; node=node.next,i++) {
    sb.append(node.data+",");
    }
    return sb.delete(sb.length()-1, sb.length()).append("]").toString();
    }


    public static void main(String[] args) {
    MyLinkedList my = new MyLinkedList();
    my.add(1);
    my.add(2);
    my.add("34");
    my.add("冷浪进");
    System.out.println(my.size);
    my.add(1,"冷霞");
    my.replace(0, "王永先");
    System.out.println(my.contains("冷浪进"));
    my.remove(2);
    System.out.println(my.getValue(2));
    System.out.println(my.indexOf("34"));
    System.out.println(my);
    }
    }

    运行结果

    4
    true
    34
    2
    [王永先,冷霞,34,冷浪进]

  • 相关阅读:
    精选文章
    Eclipse Git插件切换分支的时候不要Reset
    Spring ContentNegotiatingViewResolver
    Spring3 MVC 类型转换
    FTP DOS 命令行
    Java xml 解析
    Java 实现FTP上传和下载
    Hibernate update 和 merge 、saveOrUpdate的区别
    Spring MVC 文件下载时候 发现IE不支持
    Javasript 正则匹配任意字符
  • 原文地址:https://www.cnblogs.com/lenglangjin/p/10726125.html
Copyright © 2011-2022 走看看