当前位置: 首页 > news >正文

C#练习题——双向链表的创建,添加和删除

一、任务一:双向链表的创建,添加和删除

(1)提供数据的个数,头节点,尾节点
(2)增加数据到链表最后
(3)删除指定位置节点


二、数据结构定义

1、双向链表节点类

/// <summary>
/// 双向链表节点类
/// </summary>
/// <typeparam name="T">泛型类型参数</typeparam>
class DoubleLinkNode<T>
{public T data;                      // 节点存储的数据public DoubleLinkNode<T> nextNode;  // 指向下一个节点的指针public DoubleLinkNode<T> LastNode;  // 指向上一个节点的指针/// <summary>/// 节点构造函数/// </summary>/// <param name="data">节点数据</param>public DoubleLinkNode(T data){this.data = data;}
}

节点特性:

  • 包含数据域 data

  • 前驱指针 LastNode 指向前一个节点

  • 后继指针 nextNode 指向后一个节点


三、核心功能实现

双向链表类框架

/// <summary>
/// 双向链表类
/// </summary>
/// <typeparam name="T">泛型类型参数</typeparam>
class DoubleLinkList<T>
{public DoubleLinkNode<T> head;  // 链表头节点public DoubleLinkNode<T> last;  // 链表尾节点// 添加、删除、显示等方法...
}
1. 添加操作 (Add)
/// <summary>
/// 向链表尾部添加新元素
/// </summary>
/// <param name="value">要添加的值</param>
public void Add(T value)
{DoubleLinkNode<T> node = new DoubleLinkNode<T>(value);if (head == null)  // 链表为空的情况{head = node;last = node;}else  // 链表非空的情况{node.LastNode = last;    // 新节点的前驱指向原尾节点last.nextNode = node;    // 原尾节点的后继指向新节点last = node;             // 更新尾节点为新节点}
}

添加操作流程:

  1. 创建新节点

  2. 如果链表为空,设置头和尾都指向新节点

  3. 如果链表非空,将新节点连接到链表尾部

  4. 更新尾指针

2. 删除操作 (Remove)
/// <summary>
/// 删除指定索引位置的节点
/// </summary>
/// <param name="index">要删除的节点索引</param>
public void Remove(int index)
{// 计算链表长度int count = 0;DoubleLinkNode<T> current = head;while (current != null){count++;current = current.nextNode;}// 检查索引有效性if (index < 0 || index >= count){Console.WriteLine("索引超出范围");return;}// 删除头节点if (index == 0){head = head.nextNode;if (head == null)  // 如果链表只有一个节点{last = null;}else{head.LastNode = null;  // 新头节点的前驱设为null}return;}// 删除尾节点if (index == count - 1){last = last.LastNode;     // 尾指针指向前一个节点last.nextNode = null;     // 新的尾节点后继设为nullreturn;}// 删除中间节点current = head;for (int i = 0; i < index; i++){current = current.nextNode;  // 移动到要删除的节点}// 跳过要删除的节点,重新连接前后节点current.LastNode.nextNode = current.nextNode;current.nextNode.LastNode = current.LastNode;
}

删除操作的三种情况:

  1. 删除头节点:更新head指针,处理前驱关系

  2. 删除尾节点:更新last指针,处理后继关系

  3. 删除中间节点:重新连接前后节点

3. 显示操作 (Show)
/// <summary>
/// 显示链表中所有元素
/// </summary>
public void Show()
{DoubleLinkNode<T> node = head;while (node != null){Console.WriteLine(node.data);  // 输出当前节点数据node = node.nextNode;          // 移动到下一个节点}
}

四、完整代码

using System;
using System.Collections.Generic;namespace DoubleLinkedListExample
{// 双向链表节点类class DoubleLinkNode<T>{public T data;public DoubleLinkNode<T> nextNode;public DoubleLinkNode<T> LastNode;public DoubleLinkNode(T data){this.data = data;}}// 双向链表类class DoubleLinkList<T>{public DoubleLinkNode<T> head;public DoubleLinkNode<T> last;// 添加方法public void Add(T value){DoubleLinkNode<T> node = new DoubleLinkNode<T>(value);if (head == null){head = node;last = node;}else{node.LastNode = last;last.nextNode = node;last = node;}}// 删除方法public void Remove(int index){int count = 0;DoubleLinkNode<T> current = head;while (current != null){count++;current = current.nextNode;}if (index < 0 || index >= count){Console.WriteLine("索引超出范围");return;}if (index == 0){head = head.nextNode;if (head == null){last = null;}else{head.LastNode = null;}return;}if (index == count - 1){last = last.LastNode;last.nextNode = null;return;}current = head;for (int i = 0; i < index; i++){current = current.nextNode;}current.LastNode.nextNode = current.nextNode;current.nextNode.LastNode = current.LastNode;}// 显示方法public void Show(){DoubleLinkNode<T> node = head;while (node != null){Console.WriteLine(node.data);node = node.nextNode;}}}class Program{static void Main(string[] args){TestDoubleLinkedList();}static void TestDoubleLinkedList(){DoubleLinkList<int> list = new DoubleLinkList<int>();// 测试添加操作Console.WriteLine("=== 添加元素测试 ===");list.Add(1);list.Add(2);list.Add(3);list.Show();Console.WriteLine("\n=== 继续添加并删除测试 ===");list.Add(4);list.Add(5);list.Remove(2);  // 删除索引为2的元素(值为3)list.Add(6);     // 添加新元素list.Show();}}
}

http://www.dtcms.com/a/393907.html

相关文章:

  • 大厂思维与“小快轻准”产品的矛盾
  • C++二进制转八进制
  • STL容器 --- 模拟实现 list
  • Java LTS版本进化秀:从8到21的欢乐升级之旅
  • yolo转tensorrt nano
  • paimon实时数据湖教程-分桶详解
  • kafka集群部署
  • Windows系统安装OpenSSL库最新版方法
  • 因果推断:关于工具变量的案例分析
  • 字节面试题:激活函数选择对模型梯度传播的影响
  • 5.Spring AI Alibaba
  • 如何优化Java并发编程以提高性能?
  • 【重量上下限报警灯红黄绿】2022-12-13
  • Node.js后端学习笔记:Express+MySQL
  • Ubuntu24.04 安装 禅道
  • StandardScaler,MinMaxScaler 学习
  • vscode+ssh连接server
  • 一文快速入门 HTTP 和 WebSocket 概念
  • Vue.js 项目创建指南
  • 核心策略、高级技巧、细节处理和心理
  • 算法优化的艺术:深入理解 Pow(x, n) 及其背后的思考
  • Projection Approximation Subspace Tracking PAST 算法
  • 容器化简单的 Java 应用程序
  • 【实证分析】上市公司并购数据dofile数据集(2005-2024年)
  • OceanBase备租户创建(三):通过带日志的物理备份恢复
  • OceanBase用户和权限管理
  • VMware Workstation Pro 虚拟机为 Ubuntu 18 配网教程
  • 城市自然资源资产离任审计试点DID
  • 算法日记---新动计划
  • Vue3水波纹指令:2025年Material Design交互新标准