数据结构—双向链表

小结:

相比单向链表,每个节点多了一个 pre 属性,指向前一个节点,

 节点类:

class node{
    node pre;
    int data;
    String data1;
    node next;

    public  node(int data, String data1) {
        this.data = data;
        this.data1 = data1;
    }

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

双向链表类:

// 双向链表类
class doubleLinkedList{
    // 初始化头节点
    node head = new node(0,"");

    // add 方法
    public void add(node node) {
        // 辅助指针 & 布尔标记
        node assist = head;
        boolean f = false;

        while (true) {
            // 指针移动到最尾
            if (assist.next == null) {
                break;
            }
            // 找到了 add 的位置,即 assist.next
            if (assist.next.data > node.data) {
                break;
            } else if (assist.next.data == node.data) { // 重复,不可继续添加
                f = true;
                break;
            }
            // 指针后移一位
            assist = assist.next;
        }

        if (f) {
            System.out.printf("已经有同样编号 %d 的元素\n", node.data);
        } else {
            if (assist.next != null) { // node 添加在 assist 之后
                assist.next.pre = node; // assist的下一个节点的 pre 指向 新节点
                node.next = assist.next; // 新节点的 next 指向 assist的下一个节点
            }
            assist.next = node;// assist的 next 指向 新节点
            node.pre = assist;// 新节点的 pre 指向 assist
        }

    }

    // upData
    public void upData(node upNode) {
        // 判断是否为空链表
        if (head.next == null) {
            System.out.println("空链表");
            return;
        }

        // 辅助指针 & 布尔标记
        node assist = head;
        boolean f = false;

        while (true) {
            // 遍历完毕,退出循环
            if (assist.next == null) {
                break;
            }
            // 找到了需要修改的元素,修改布尔标记,退出循环
            if (assist.next.data == upNode.data) {
                f = true;
                break;
            }
            // 指针后移一位
            assist = assist.next;
        }

        if (f) { // 修改
            assist.next.data = upNode.data;
            assist.next.data1 = upNode.data1;
        } else {
            System.out.printf("找不编号为:%d 的节点进行修改", upNode.data);
        }
    }

    // delete
    public void delete(int num) {
        // 判断是否为空链表
        if (head.next == null) {
            System.out.println("空链表");
            return;
        }

        // 辅助指针 & 布尔标记
        node assist = head;
        boolean f = false;

        while (true) {
            // 遍历完毕,退出循环
            if (assist.next == null) {
                break;
            }
            // 找到了需要删除的节点,即 assist.next
            if (assist.next.data == num) {
                f = true;
                break;
            }
            // 指针后移一位
            assist = assist.next;
        }

        if (f) {
            if (assist.next.next != null) {
                assist.next.next.pre = assist;
                assist.next = assist.next.next;
                return;
            }
            assist.next = null;
        } else {
            System.out.printf("待删除的:%d 号节点不存在\n", num);
        }

    }

    // show方法
    public void show() {
        // 判断是否为空链表
        if (head.next == null) {
            System.out.println("空链表");
            return;
        }

        // 辅助指针
        node assist = head.next;
        System.out.println("遍历得到:");
        while (true) {
            System.out.println(assist);
            // 判断是否遍历完毕
            if (assist.next == null) {
                break;
            }
            // 指针后移一位
            assist = assist.next;
        }
    }

}

测试:

public class doubleLinkedListDome {
    public static void main(String[] args) {
        doubleLinkedList doubleLinkedList = new doubleLinkedList();

        node one = new node(1,"一");
        node two = new node(2,"二");
        node three = new node(3,"三");
        node four = new node(4,"四");
        node fakeOne = new node(1,"假一");

        // add
        doubleLinkedList.add(fakeOne);
        doubleLinkedList.add(four);
        doubleLinkedList.add(three);
        doubleLinkedList.add(two);
        doubleLinkedList.show();

        // upData
        doubleLinkedList.upData(one);
        doubleLinkedList.show();

        // delete
        doubleLinkedList.delete(1);
        doubleLinkedList.delete(4);
        doubleLinkedList.delete(2);
        doubleLinkedList.show();




    }
}

结构如下:

遍历得到:
node{data=1, data1='假一'}
node{data=2, data1='二'}
node{data=3, data1='三'}
node{data=4, data1='四'}
遍历得到:
node{data=1, data1='一'}
node{data=2, data1='二'}
node{data=3, data1='三'}
node{data=4, data1='四'}
遍历得到:
node{data=3, data1='三'}

进程已结束,退出代码0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值