数据结构与算法--双向链表(Double Linked List)、单向环形链表(Circular Linked List)

本文介绍了双向链表和单向环形链表的基础概念、结构特点以及优缺点。详细讲解了双向链表的结点组成、遍历、增删改查操作,并给出了代码实现。对于单向环形链表,同样阐述了其结构和操作,尤其强调了在添加和删除结点时防止空指针问题的重要性。最后,单向环形链表的引入是为了讨论约瑟夫环问题。
摘要由CSDN通过智能技术生成

此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢!


一、双向链表-概述

-双向链表的基本组成结构:

  • Node:自定义的结点结构。
  • (Node) head:指向单链表头结点的“头指针”。

-自定义结点的基本组成结构:

  • 数据域:存放具有实际意义的数据。
  • “指针”域(next):存放一个指向下一结点的“指针”。
  • “指针”域(pre):存放一个指向上一结点的“指针”。【与单链表的区别】

在这里插入图片描述
-优点:

  1. 遍历方向:单链表只能朝向一个方向遍历查找;而双向链表可以朝两个方向遍历查找。
  2. 结点的自我删除:单链表在进行删除操作时,无法实现自我删除,因此代码实现中我们都是通过遍历到目标结点的前一个结点时停下;而双向链表在进行删除操作时,可以实现自我删除。

-内容:

  • 构造方法。
  • add()【向链表中添加结点】
  • addByOrder()【向链表中按顺序(默认升序)添加结点】
  • update()【更新链表中已存在的某个结点的信息】
  • delete()【删除链表中已存在的的某个结点】
  • show()【打印出链表中所有元素的内容】

(关于单链表的属性、构造器、结点结构及基本方法,具体可见:数据结构与算法–单链表(Single Linked List)

(单链表相关的企业面试题,具体可见:数据结构与算法–单链表相关面试题


二、双向链表-代码实现

  • Custom Node(自定义结点结构)
/*
 HeroNode2

 Zzay

 2021/01/20
 */
package com.zzay.linkedlist.impl;

/**
 * Define the node of the double linked list.
 *
 * @author Zzay
 * @version 2021/01/20
 */
public class HeroNode2 {
   

    private int no;

    private String name;

    private String nickname;

    protected HeroNode2 next;

    protected HeroNode2 pre; // The difference from single linked list

    public HeroNode2(int hNo, String hName, String hNickname) {
   
        no = hNo;
        name = hName;
        nickname = hNickname;
        next = null;
        pre = null;
    }

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

    public int getNo() {
   
        return no;
    }

    public String getName() {
   
        return name;
    }

    public String getNickname() {
   
        return nickname;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public void setNickname(String nickname) {
   
        this.nickname = nickname;
    }
}
  • Attributes and constructor
/*
 DoubleLinkedList

 Zzay

 2021/01/20
 */
package com.zzay.linkedlist.impl;


/**
 * The implementations of a double linked list.
 * <p>
 * CONTENTS:
 * (1) Add nodes.
 * (2) Update a node's information.
 * (3) Delete a node from the single linked list. (注意空指针)
 * (4) Show the contents of the single linked list.
 *
 * @author Zzay
 * @version 2021/01/20
 */
public class DoubleLinkedList {
   

    // The head node of the double linked list. It does not store any practical data.
    private HeroNode2 head = new HeroNode2(0, "", "");

    /**
     * Instantiate a double linked list without giving any nodes.
     */
    public DoubleLinkedList() {
   
    }

    /**
     * Instantiate a double linked list with a given head node.
     *
     * @param head The given head node
     */
    public DoubleLinkedList(HeroNode2 head) {
   
        this.head = head;
    }
}
  • Methods
    /**
     * Add new node into the double linked list.
     *
     * @param newNode The new node to be added
     */
    public void add(HeroNode2 newNode) {
   
        HeroNode2 temp = head;
        while (temp.next != null) {
    // When the list gets to the end.
            temp = temp.next;
        }
        temp.next = newNode;
        newNode.pre = temp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值