java单链表和双向链表的代码实现

链表

单链表

package com.linkedlist;

import com.sun.xml.internal.bind.util.Which;

import java.util.WeakHashMap;

public class SingleLinkedListDemo {
     
    public static void main(String[] args) {
     
        //测试
        //先创建节点
        HeroNode hero1 = new HeroNode(1, "松江", "及时雨");
        HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode hero3 = new HeroNode(3,"吴用","智多星");
        HeroNode hero4 = new HeroNode(4,"林冲","豹子头");

        //创建一个链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        //加入
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);
//        singleLinkedList.add(hero4);

        //按编号顺序加入
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero3);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero2);

        //输出
        singleLinkedList.list();

        //测试修改节点的代码
        HeroNode newHeroNode = new HeroNode(3,"吴用upup","智多星upup");
        singleLinkedList.update(newHeroNode);
        System.out.println("---修改后情况---");
        singleLinkedList.list();

        //测试删除节点
        singleLinkedList.delete(3);
        System.out.println("---删除后情况---");
        singleLinkedList.list();
    }
}

//定义HeroNode,链表的节点
class HeroNode{
     
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;//指向下一个节点

    //构造器
    public HeroNode(int no,String name,String nickname){
     
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    //重写toString,不打印next

    @Override
    public String toString() {
     
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}


/**
 * 定义一个SingleLinkedList链表 管理节点
 */
class SingleLinkedList{
     
    //初始化一个头结点,不存放具体数据
    private HeroNode head = new HeroNode(0,"","");

    //添加节点方法
    //添加到最后
    public void add(HeroNode heroNode){
     

        //辅助指针temp
        HeroNode temp = head;
        //遍历链表,找到最后
        while (true) {
     
            if (temp.next == null) {
     
                break;
            }
            //如果没有找到最后,就将temp后移
            temp = temp.next;
        }
        //退出while循环时,temp就指向了最后一个节点
        //添加新的节点
        temp.next=heroNode;
    }

    //添加节点方法
    //添加到链表最后,尾插法
    public void addByOrder(HeroNode heroNode){
     
        //辅助指针temp,位于添加位置的前一个节点
        HeroNode temp = head;
        boolean flag = false; //标志添加的编号是否存在,默认为false
        while (true){
     
            if (temp.next == null) {
     //说明temp已经在链表最后
                break;
            }else if(temp.next.no > heroNode.no){
     //位置找到,在temp后面插入
                break;
            }else if(temp.next.no == heroNode.no){
     //说明添加的编号已存在
                flag = true;
                break;
            }
            temp = temp.next; // 后移
        }
        //判断flag的值
        if(flag){
     //编号存在,不能添加
            System.out.println("准备插入的英雄编号已经存在,不能添加");
        }else {
     
            //插入到链表中,temp后面
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

    //修改节点信息,根据newHeroNode的no编号修改
    public void update(HeroNode newHeroNode){
     
        //判断是否为空
        if(head.next == null){
     
            System.out.println("链表为空");
            return;
        }
        //找到需要修改的节点,根据no编号
        //定义辅助变量temp
        HeroNode temp = head.next;
        boolean flag =false; //表示是否找到该节点
        while (true){
     
            if(temp == null){
     
                break; //遍历到最后
            }else if(temp.no == newHeroNode.no){
     
                //找到
                flag=true;
                break;
            }
            temp=temp.next;
        }
        //根据flag判断是否找到要修改的节点
        if(flag){
     
            temp.name = newHeroNode.name;
            temp.nickname = newHeroNode.nickname;
        }else{
     
            System.out.println("未找到需要修改的节点");
        }
    }

    //删除节点
    public void delete(int no){
     
        //判断是否为空
        if (head.next == null){
     
            System.out.println("链表为空");
            return;
        }
        //
        HeroNode temp = head;
        boolean flag = false;
        //找到待删除节点的前一个节点
        while (true){
     
            if(temp.next==null){
     //遍历到最后
                break;
            }else if(temp.next.no == no){
     //找到待删除节点的前一个节点
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //判断flag
        if (flag){
     
            //可以删除
            temp.next =temp.next.next;
        }else {
     
            System.out.println("未找到待删除节点");
        }
    }
    //显示链表(遍历)
    public void list(){
     
        //先判断链表是否为空
        if (head.next == null){
     
            System.out.println("链表为空");
            return;
        }
        //辅助指针temp
        HeroNode temp = head.next;
        while(true){
     
            //判断是否到最后
            if(temp == null){
     
                break;
            }
            //输出节点信息
            System.out.println(temp.toString());
            //next后移
            temp=temp.next;
        }
    }
}

双向链表

package com.linkedlist;

public class DoubleLinkedListDemo {
     
    public static void main(String[] args) {
     
        //测试
        System.out.println("双向链表的测试:");

        //先创建双向列表节点
        HeroNode2 hero1 = new HeroNode2(1, "松江", "及时雨");
        HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟");
        HeroNode2 hero3 = new HeroNode2(3,"吴用","智多星");
        HeroNode2 hero4 = new HeroNode2(4,"林冲","豹子头");

        //创建一个双向链表
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        //加入
//        doubleLinkedList.add(hero1);
//        doubleLinkedList.add(hero2);
//        doubleLinkedList.add(hero3);
//        doubleLinkedList.add(hero4);


        //按编号顺序加入
        doubleLinkedList.addByOrder(hero1);
        doubleLinkedList.addByOrder(hero3);
        doubleLinkedList.addByOrder(hero4);
        doubleLinkedList.addByOrder(hero2);

        //输出
        doubleLinkedList.list();

        //测试修改节点的代码
        HeroNode2 newHeroNode = new HeroNode2(3,"吴用upup","智多星upup");
        doubleLinkedList.update(newHeroNode);
        System.out.println("---修改后情况---");
        doubleLinkedList.list();

        //测试删除节点
        doubleLinkedList.delete(3);
        System.out.println("---删除后情况---");
        doubleLinkedList.list();
    }
}

//定义HeroNode2,节点
class HeroNode2{
     
    public int no;
    public String name;
    public String nickname;
    public HeroNode2 next;//指向下一个节点
    public HeroNode2 pre;//指向前节点

    //构造器
    public HeroNode2(int no,String name,String nickname){
     
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    //重写toString,不打印next

    @Override
    public String toString() {
     
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
//创建一个双向链表的类
class DoubleLinkedList{
     
    //初始化一个头结点,不存放具体数据
    private HeroNode2 head = new HeroNode2(0,"","");

    //遍历双向链表,与单链表一样
    public void list(){
     
        //先判断链表是否为空
        if (head.next == null){
     
            System.out.println("链表为空");
            return;
        }
        //辅助指针temp
        HeroNode2 temp = head.next;
        while(true){
     
            //判断是否到最后
            if(temp == null){
     
                break;
            }
            //输出节点信息
            System.out.println(temp.toString());
            //next后移
            temp=temp.next;
        }
    }

    //添加到双向链表最后
    public void add(HeroNode2 heroNode) {
     
        //辅助指针temp
        HeroNode2 temp = head;
        //遍历链表,找到最后
        while (true) {
     
            if (temp.next == null) {
     
                break;
            }
            //如果没有找到最后,就将temp后移
            temp = temp.next;
        }
        //退出while循环时,temp就指向了最后一个节点
        //添加新的节点,形成双向链表
        temp.next = heroNode;
        heroNode.pre = temp;
    }

    //添加节点方法
    //按no编号顺序插入
    public void addByOrder(HeroNode2 heroNode){
     
        //辅助指针temp,位于添加位置的前一个节点
        HeroNode2 temp = head;
        boolean flag = false; //标志添加的编号是否存在,默认为false
        while (true){
     
            if (temp.next == null) {
     //说明temp已经在链表最后
                break;
            }else if(temp.next.no > heroNode.no){
     //位置找到,在temp后面插入
                break;
            }else if(temp.next.no == heroNode.no){
     //说明添加的编号已存在
                flag = true;
                break;
            }
            temp = temp.next; // 后移
        }
        //判断flag的值
        if(flag){
     //编号存在,不能添加
            System.out.println("准备插入的英雄编号已经存在,不能添加");
        }else {
     
            //插入到链表中,temp后面
            heroNode.next = temp.next;
            temp.next = heroNode;
            if(heroNode.next!=null){
     
                //如果是最后一个节点则不需要
                heroNode.next.pre = heroNode;
                heroNode.pre = temp;
            }
        }
    }

    //修改,同单向链表
    public void update(HeroNode2 newHeroNode){
     
        //判断是否为空
        if(head.next == null){
     
            System.out.println("链表为空");
            return;
        }
        //找到需要修改的节点,根据no编号
        //定义辅助变量temp
        HeroNode2 temp = head.next;
        boolean flag =false; //表示是否找到该节点
        while (true){
     
            if(temp == null){
     
                break; //遍历到最后
            }else if(temp.no == newHeroNode.no){
     
                //找到
                flag=true;
                break;
            }
            temp=temp.next;
        }
        //根据flag判断是否找到要修改的节点
        if(flag){
     
            temp.name = newHeroNode.name;
            temp.nickname = newHeroNode.nickname;
        }else{
     
            System.out.println("未找到需要修改的节点");
        }
    }

    //删除节点,可以直接找到要删除节点,然后自我删除
    public void delete(int no){
     
        //判断是否为空
        if (head.next == null){
     
            System.out.println("链表为空,无法删除");
            return;
        }
        //
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (true){
     
            if(temp == null){
     //遍历到最后
                break;
            }else if(temp.no == no){
     //找到待删除节点
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //判断flag
        if (flag){
     
            //双向列表的删除
            temp.pre.next =temp.next;
            if (temp.next!=null){
     
                //如果是最后一个节点则不需要
                temp.next.pre = temp.pre;
            }
        }else {
     
            System.out.println("未找到待删除节点");
        }
    }
}

个人学习笔记,最后求看到的大佬给个赞吧(#^ .^#)!!

你可能感兴趣的:(链表,java,列表,数据结构,算法)