双向链表实现

双向链表实现

  • 双向链表和单链表的比较
    1.单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
    2.单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以单链表删除节点时,总是找到删除节点的前一个节点。
  • 双向链表java实现代码
/**
 * @author zl
 * @create 2020--09--03--16:37
 */
public class DoubleLinkedList {
    public static void main(String[] args) {
        Node node = new Node(1, "aaa");
        Node node1 = new Node(2, "bbb");
        Node node2 = new Node(3, "ccc");
        LinkedList linkedList = new LinkedList();
        linkedList.addNode(node);
        linkedList.addNode(node1);
        linkedList.addNode(node2);
        linkedList.showNode();
        linkedList.delNode(node1);
        linkedList.showNode();
    }
}

class LinkedList {
    //初始化头结点
    private Node head = new Node(0, "");

    //返回头结点
    public Node getHeadNode() {
        return head;
    }

    //遍历节点
    public void showNode() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //添加节点
    public void addNode(Node node) {
        Node temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }

    //修改节点
    public void updateNode(Node node) {
        if (head.next == null) {
            System.out.println("链表为空");
        }
        Node temp = head.next;
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = node.name;
        } else {
            System.out.println("没有找到");
        }
    }

    //删除节点
    public void delNode(Node node) {
        if (head.next == null) {
            System.out.println("没有节点");
        }

        Node temp = head.next;
        boolean flag = true;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //直接在当前节点上删除
        if (flag) {
            temp.pre.next = temp.next;
            if (temp.next != null) { //如果不是最后一个节点,最后一个节点的话会报错
                temp.next.pre = temp.pre;
            }
        } else {
            System.out.printf("要删除的%d节点不存在", node.no);
        }
    }

}

class Node {
    public int no;
    public String name;
    public Node pre;
    public Node next;

    public Node(int no, String name) {
        this.no = no;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值