数据结构之链表

xiaoxiao2025-07-26  15

node 类

public class Node<T> { public T Date; // public Node<T> Next; public Node() { Date = default(T); Next = null; } public Node(T value) { Date = value; Next = null; } }

LinkList 类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinkList { //一般链表都是有头部节点的 简称为头结点 头结点不参与运算 public class LinkList<T> { private Node<T> _head; private int _count; public LinkList() { //new 对象 _head.next --> null head.data = 0 _head = new Node<T>(); _count = 0; } public void AddItem(Node<T> newNode) { //找到头结点 Node<T> tmpNode = _head; //循环找到最后结点 while (tmpNode.Next != null) { tmpNode = tmpNode.Next; } //将最后结点和即将插入的结点链接 tmpNode.Next = newNode; //个数++ _count++; } public void Insert(int index, Node<T> newNode) { Node<T> tempNode = _head; if (index<0 || index>_count) { Console.WriteLine("over!!"); return; } for (int i = 0; i < index; i++) { tempNode = tempNode.Next; } newNode.Next = tempNode.Next; tempNode.Next = newNode; _count++; } public T RemoveAt(int index) { Node<T> temp = _head; Node<T> tempNext = default(Node<T>); if (index < 0 || index >= _count) { Console.WriteLine("over!!"); return tempNext.Date; } for (int i = 0; i < index; i++) { //目标前一个节点 temp = temp.Next; } //目标节点 tempNext = temp.Next; //目标前 拉 目标后 temp.Next = tempNext.Next; //目标后 设为null tempNext.Next = null; _count--; return tempNext.Date; } public void ShowItem(Action<int,T> ac) { Node<T> tmp = _head; if (_count == 0) { Console.WriteLine("Null"); return; } for (int i = 0; i < _count; i++) { ac(i, tmp.Next.Date); tmp = tmp.Next; } } /// <summary> /// 递归实现链表倒序 法一 /// </summary> /// <param name="node"></param> /// <returns></returns> public Node<T> ReverseLink(Node<T> node) { if (node.Next == null) { return node; } Node<T> rHead = ReverseLink(node.Next); node.Next.Next = node; node.Next = null; return rHead; } /// <summary> /// 倒序 /// </summary> public void Reverse() { //递归实现链表倒序 法一 //没节点 或只有一个 if (_head.Next == null || _head.Next.Next == null) { return; } _head.Next = ReverseLink(_head.Next); return; 法二 Node node = _head.Next; Node temp = node; while (temp != null) { node = _head.Next; if (temp != null) { _head.Next = temp; temp = temp.Next; _head.Next.Next = node; } else { temp = temp.Next; node.Next.Next = null; } } //法三 Node <T> node = _head.Next; Node<T> shang = null; Node<T> xia = null; while (node != null) { xia = node.Next; node.Next = shang; shang = node; node = xia; } _head.Next = shang; } //法四 public void LLWH_Reverse() { Node<T> T1, T2; T2 = _head.Next; _head.Next = null; while (T2 != null) { T1 = T2.Next; T2.Next = _head.Next; _head.Next = T2; T2 = T1; } } public int GetLength() { return _count; } public void Clear() { _head.Next = null; _count = 0; } } }

法四应用

class MyClass { public string name; public MyClass(string name) { this.name = name; } public static bool Querys(Node<MyClass> node1,Node<MyClass> node2) { bool returnValue = false; if (node1.Date.name.Length > node2.Date.name.Length) { returnValue = true; } return returnValue; } } class Program { static void Show(int index,MyClass value) { Console.WriteLine("第{0}个元素是 : {1}",index+1,value.name); } static void Main(string[] args) { LinkList<MyClass> link = new LinkList<MyClass>(); link.AddItem(new Node<MyClass>(new MyClass("我"))); link.AddItem(new Node<MyClass>(new MyClass("最帅"))); link.AddItem(new Node<MyClass>(new MyClass("恩恩额"))); link.AddItem(new Node<MyClass>(new MyClass("是你最帅"))); link.AddItem(new Node<MyClass>(new MyClass("是蟋蟀的帅"))); link.ShowItem(Show); Console.WriteLine("-------删除最小值-------"); MyClass my = link.RemoveMix(MyClass.Querys); Console.WriteLine(my.name); link.ShowItem(Show); Console.ReadLine(); } }```
转载请注明原文地址: https://www.6miu.com/read-5033777.html

最新回复(0)