Java数据结构-双向链表

本文展示了一个Java程序,用于实现双向链表,包括添加前指针,通过前指针对链表进行操作,如按顺序插入、头插法、删除和更新结点。在下一个为空的情况下,程序能正确处理挂载新结点的问题。

1、双向链表添加了前指针pre

2、对双链表进行操作时,定位到该指针(单链表需要定位在前一个)

3、当下一个为空时,该如何进行挂载结点



/* 双向链表

 */
public class DoubleLink {
    public static void main(String[] args) {
        LinkAchieve l = new LinkAchieve();
        DoubleLinkDemo d1 = new DoubleLinkDemo(1, "李东");
        DoubleLinkDemo d2 = new DoubleLinkDemo(2, "李明");
        DoubleLinkDemo d3 = new DoubleLinkDemo(3, "李红");
        DoubleLinkDemo d4 = new DoubleLinkDemo(4, "李芳");
        DoubleLinkDemo d5 = new DoubleLinkDemo(5, "李钱");


        l.sortedAdd(d3);
        l.sortedAdd(d4);
        l.sortedAdd(d1);
        l.sortedAdd(d2);

        l.headAdd(d5);

        l.show();
        // 删除结点
        l.deletNode(d2);
        System.out.println();
        l.show();
        System.out.println();
        //修改结点

        l.upDate(5, "李钱~~~");
        l.show();


    }
}

// 双向链表的实现功能
class LinkAchieve {
    private DoubleLinkDemo head = new DoubleLinkDemo(0, "");// 实现头结点

    // 尾插法
    public void add(DoubleLinkDemo d) {
        DoubleLinkDemo temp = head;
        // 移动到最后一个
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        d.next = temp.next;
        d.pre = temp;
        temp.next = d;
    }

    // 头插法
    public void headAdd(DoubleLinkDemo d) {
        DoubleLinkDemo temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.no == d.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println("已有相同结点,无法进行头插法插入元素");
            return;
        } else {
            temp = head;
            d.next = temp.next;
            // 下一个为空的,另外的操作,否则会出现异常
            if (temp.next != null) {
                temp.next.pre = d;
            }
            d.pre = temp;
            temp.next = d;
        }

    }

    // 按顺序进行插入
    public void sortedAdd(DoubleLinkDemo d) {
        DoubleLinkDemo temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                d.next = temp.next;
                d.pre = temp;
                temp.next = d;
                break;
            }
            if (temp.next.no > d.no) {
                d.next = temp.next;
                temp.next.pre = d;
                d.pre = temp;
                temp.next = d;
                break;
            } else if (temp.next.no == d.no) {
                flag = true;
                break;
            }
            temp = temp.next; //  后移

        }
        if (flag) {               // 满足条件的进行插入
            System.out.println("h" + d.no + "已经存在,无法插入");
        }


    }

    // 修改对应的结点
    public void upDate(int no, String data) {
        DoubleLinkDemo temp = head;

        boolean flag = false;
        if (temp.next == null) {
            System.out.println("为空链表,无法进行修改指定的值");
            return;
        }
        while (true) {
            if (temp == null) {
                // 没有该结点
                break;
            } else if (temp.no == no) {// 定位到该结点
                flag = true;
                break;

            }
            temp = temp.next;
        }
        if (flag) {
            temp.data = data;
        } else {
            System.out.printf("该链表内,不存在序号为:%d 的结点", no);
            System.out.println();
        }
    }

    // 删除相应的结点
    public void deletNode(DoubleLinkDemo d) {
        DoubleLinkDemo temp = head;

        boolean flag = false;
        if (temp.next == null) {
            System.out.println("为空链表,无法进行删除指定的值");
            return;
        }
        while (true) {
            if (temp == null) {
                // 没有该结点
                break;
            } else if (temp.no == d.no) {// 定位到该结点
                flag = true;
                break;

            }
            temp = temp.next;
        }
        if (flag) {
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }
            temp.pre.next = temp.next;


        } else {
            System.out.println("该链表内,不存在相应的结点");
        }


    }

    // 遍历链表
    public void show() {
        DoubleLinkDemo temp = head;
        // 判断是否为空链表
        if (temp.next == null) {
            System.out.println("此链表为空链表");
            return;
        }
        while (temp.next != null) {
            temp = temp.next;
            System.out.println(temp.toString());
        }
    }


}

// 双向链表基本结构

class DoubleLinkDemo {
    public int no;
    public String data;
    public DoubleLinkDemo next;
    public DoubleLinkDemo pre;

    // 双向链表构造器
    public DoubleLinkDemo(int no, String data) {
        this.no = no;
        this.data = data;


    }

    @Override
    public String toString() {
        return "DoubleLinkDemo{" +
                "no=" + no +
                ", data='" + data + '\'' +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值