数据结构&算法-双向链表

双向链表

双向链表也是链表的一种,它每个数据结点中都有两个结点,分别指向其直接前驱和直接后继。所以我们从双向链表的任意一个结点开始都可以很方便的访问其前驱元素和后继元素。
在这里插入图片描述

代码

在这里插入图片描述

using System;

namespace DoubleLinkedList
{
    class Program
    {
        static void Main(string[] args)
        {
            DoubleLink<string> doubleLink = new DoubleLink<string>("头");
            doubleLink.AddNode(1, new Node<string>("第一名"));
            doubleLink.AddNode(1, new Node<string>("第5名"));
            doubleLink.AddNode(1, new Node<string>("第4名"));
            doubleLink.AddNode(1, new Node<string>("第9名"));
            doubleLink.AddNode(3, new Node<string>("第9名"));
            doubleLink.RemoveNode(4);
            doubleLink.AmendData(2, "被修改的");
            doubleLink.TraversingList();
        }
    }

    /// <summary>
    /// 结点
    /// </summary>
    class Node<T>
    {
        public Node<T> next;
        public Node<T> last;
        T content;

        public Node(T content)
        {
            this.content = content;
        }
        public void AmendData(T amend)
        {
            content = amend;
        }
        public T GetContent()
        {
            return content;
        }
    }
    class DoubleLink<T>
    {
        Node<T> head; //头部不算个数,索引为0
        public DoubleLink(T t)
        {
            head = new Node<T>(t);
        }

        int NodeNum = 0;

        /// <summary>
        /// 添加结点
        /// </summary>
        /// <param name="index"></param>
        /// <param name="node"></param>
        public void AddNode(int index, Node<T> node)
        {
            if (index < 1 || index > NodeNum + 1)
            {
                return;
            }
            Node<T> needNode = head;

            if (index == NodeNum + 1)
            {
                for (int i = 0; i < NodeNum; i++)
                {
                    needNode = needNode.next;
                }
                needNode.next = node;
                node.last = needNode;
                NodeNum++;
            }
            else
            {
                for (int i = 0; i < index; i++)
                {
                    needNode = needNode.next;
                }
                needNode.last.next = node;
                node.last = needNode.last;
                node.next = needNode;
                needNode.last = node;
                NodeNum++;
            }
        }

        /// <summary>
        /// 删除结点
        /// </summary>
        /// <param name="index"></param>
        public void RemoveNode(int index)
        {
            if (index < 1 || index > NodeNum)
            {
                return;
            }

            Node<T> needNode = head;
            for (int i = 0; i < index; i++)
            {
                needNode = needNode.next;
            }
            needNode.last.next = needNode.next;
            if (needNode.next != null)
            {
                needNode.next.last = needNode.last;
                needNode.next = null;
            }

            needNode.last = null;
            needNode = null;
        }

        /// <summary>
        /// 查询结点
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public Node<T> GetNode(int index)
        {
            if (index < 1 || index > NodeNum)
            {
                return null;
            }
            Node<T> needNode = head;
            for (int i = 0; i < index; i++)
            {
                needNode = needNode.next;
            }
            return needNode;
        }

        public Node<T> AmendData(int index, T content)
        {
            if (index < 1 || index > NodeNum)
            {
                return null;
            }
            Node<T> needNode = head;
            for (int i = 0; i < index; i++)
            {
                needNode = needNode.next;
            }
            needNode.AmendData(content);
            return needNode;
        }

        /// <summary>
        /// 遍历链表
        /// </summary>
        public void TraversingList()
        {
            Node<T> curNode = head;
            while (curNode != null)
            {
                Console.WriteLine(curNode.GetContent());
                curNode = curNode.next;
            }
        }
    }
}

参考【数据结构】之双向链表、双端(双向)链表、循环(双向)链表

package 单双向链表; /** * 单向链增删改查操作 * */ public class LinkTest { public static void main(String[] args) { Link l=new Link(); l.addNode("A"); l.addNode("B"); l.addNode("C"); l.addNode("D"); l.addNode("E"); l.printNode(); System.out.println("\n是否包含D:"+l.contains("D")); System.out.println("==========删除之前的内容=========="); l.printNode(); System.out.println("\n==========删除之后的内容=========="); l.deleteNode("A"); l.printNode(); } } class Link{//链的完成类 class Node{//保存每个节点 private String data;//节点内容 private Node next;//下一个节点 public Node(String data){ this.data=data; } public void add(Node newNode) {//将节点加入到合适的位置 if(this.next==null){ this.next=newNode; }else{ this.next.add(newNode); } } public void print() {//输出节点的内容 System.out.print(this.data+"\t"); if(this.next!=null){ this.next.print();//递归调用输出 } } public boolean search(String data){//内部搜索的方法 if(data.equals(this.data)){ return true; }else{ if(this.next!=null){//向下继续判断 return this.next.search(data); }else{ return false; } } } public void delete(Node previous, String data) { if(data.equals(this.data)){//找到了匹配的节点 previous.next=this.next;//空出当前的节点 }else{ if(this.next!=null){ this.next.delete(this, data);//继续查找 } } } } private Node root;//链中的根节点 public void addNode(String data){//增加节点 Node newNode=new Node(data); if(root==null){ root=newNode; }else{ root.add(newNode); } } public void printNode(){//链的输出 if(root!=null){ root.print(); } } public boolean contains(String name){//判断元素是否存在 return this.root.search(name); } public void deleteNode(String data){//链删除节点 if(this.contains(data)){ if(this.root.data.equals(data)){//如果是根节点 this.root=this.root.next;//修改根节点 }else{ this.root.next.delete(root,data);//把下一个节点的前节点和要删除的节点内容一起传入 } } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值