C#数据结构-单链表

   理论基础:

    链表是用一组任意的存储单元来存储线性表中的数据元素

    如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。

    单链表由头引用H唯一确定。头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中。

   C#实现:

    1接口

         引用线性表的接口IListDS<T>

    2实现

         首先,必须定义一个单链表的节点类。

Code
 1 public class Node<T>
 2    {
 3        private T data;        //数据域
 4        private Node<T> next;  //引用域
 5
 6        
 7        public Node(T val)
 8        {
 9            data = val;
10            next = null;
11        }

12
13        public Node()
14        {
15            data = default(T);
16            next = null;
17        }

18
19        public T Data
20        {
21            get
22            {
23                return data;
24            }

25            set
26            {
27                data = value;
28            }

29        }

30        public Node<T> Next
31        {
32            get
33            {
34                return next;
35            }

36            set
37            {
38                next = value;
39            }

40        }

41
42
43    }

     实现主体类

     Append,Insert,InsertBack三个方法实质上都是插入操作,可以考虑用overload或者override来实现,有兴趣的朋友试试。

Code
  1public class LinkList<T> : IListDS<T>
  2    {
  3        private Node<T> head;
  4        public Node<T> Head
  5        {
  6            get
  7            {
  8                return head;
  9            }

 10            set
 11            {
 12                head = value;
 13            }

 14        }

 15        public LinkList()
 16        {
 17            head = null;
 18        }

 19
 20        /**//// <summary>
 21        /// 获取长度
 22        /// </summary>
 23        /// <returns></returns>

 24        public int GetLength()
 25        {
 26            Node<T> p = head;
 27            int len = 0;
 28            while (p != null)
 29            {
 30                ++len;
 31                p = p.Next;
 32            }

 33            return len;
 34        }

 35
 36        /**//// <summary>
 37        /// 清空操作
 38        /// </summary>

 39        public void Clear()
 40        {
 41            head = null;
 42        }

 43
 44        /**//// <summary>
 45        /// 判断线性表是否为空
 46        /// </summary>
 47        /// <returns></returns>

 48        public bool IsEmpty()
 49        {
 50            if (head == null)
 51            {
 52                return true;
 53            }

 54            else
 55            {
 56                return false;
 57            }

 58        }

 59
 60        /**//// <summary>
 61        /// 附加操作,线性表未满,将值为item的新元素添加到末尾
 62        /// </summary>
 63        /// <param name="item"></param>

 64        public void Append(T item)
 65        {
 66            Node<T> newNode = new Node<T>(item);  //根据元素创建新的节点
 67            Node<T> node = new Node<T>();
 68
 69            if (head == null)
 70            {
 71                head = newNode;
 72                return;
 73            }

 74            node = head;
 75            while (node.Next != null)
 76            {
 77                node = node.Next;
 78            }

 79            node.Next = newNode;
 80
 81        }

 82
 83        /**//// <summary>
 84        /// 寻找节点
 85        /// </summary>
 86        /// <param name="i"></param>
 87        /// <returns></returns>

 88        public Node<T> FindNode(int i)
 89        {
 90            if (IsEmpty())
 91            {
 92                Console.Write("List is empty");
 93                return null;
 94            }

 95            if (i < 1)
 96            {
 97                Console.Write("Index is error");
 98                return null;
 99            }

100            Node<T> current = head;
101            int j = 1;
102
103            while (current.Next != null && j < i)
104            {
105                ++j;
106                current = current.Next;
107            }

108            return current;
109        }

110
111        /**//// <summary>
112        /// 插入操作,在第i个节点前面插入item
113        /// </summary>
114        /// <param name="item"></param>
115        /// <param name="i"></param>

116        public void Insert(T item, int i)
117        {
118            Node<T> newNode = new Node<T>(item);
119            Node<T> node = new Node<T>();
120            Node<T> current = FindNode(i);
121            if (current != null)
122            {
123                node = current;       //对目标节点备份
124                newNode.Next = current;
125                node.Next = newNode;
126            }

127        }

128
129        /**//// <summary>
130        /// 插入操作,在第i个节点后面插入item
131        /// </summary>
132        /// <param name="item"></param>
133        /// <param name="i"></param>

134        public void InsertBack(T item, int i)
135        {
136            Node<T> newNode = new Node<T>(item);
137            Node<T> current = FindNode(i);
138            if (current != null)
139            {
140                newNode.Next = current.Next;
141                current.Next = newNode;
142            }

143        }

144
145        /**//// <summary>
146        /// 删除操作
147        /// </summary>
148        /// <param name="i"></param>
149        /// <returns></returns>

150        public T Delete(int i)
151        {
152            Node<T> current = FindNode(i);
153            Node<T> node = new Node<T>();
154            if (current != null)
155            {
156                node = current;   //对目标节点备份
157                node.Next = current.Next;
158                return current.Data;
159            }

160            else
161            {
162                Console.Write("the node is not exist!");
163                return default(T);
164            }

165        }

166
167        /**//// <summary>
168        /// 去表元
169        /// </summary>
170        /// <param name="i"></param>
171        /// <returns></returns>

172        public T GetElem(int i)
173        {
174            Node<T> current = FindNode(i);
175
176            if (current != null)
177            {
178                return current.Data;
179            }

180            else
181            {
182                Console.Write("the node is not exist!");
183                return default(T);
184            }

185        }

186
187        /**//// <summary>
188        /// 按值查找
189        /// </summary>
190        /// <param name="value"></param>
191        /// <returns></returns>

192        public int Locate(T value)
193        {
194            if (IsEmpty())
195            {
196                Console.WriteLine("List is Empty!");
197                return -1;
198            }

199            Node<T> current = new Node<T>();
200            current = head;
201            int i = 1;
202            while (current.Next != null && !current.Data.Equals(value))
203            {
204                current = current.Next;
205                ++i;
206            }

207            return i;
208        }

209    }

碰到的问题:1 方法参数为int类型,改用object类型碰到一些问题,查找节点的时候,遍历整个链表,如何对比参数节点

                   对比参数会不会影响算法的时间复杂度

                2 append,insert,insertback方法本质上都是插入操作,有没有更好的方法实现 

代码没有经过测试,有兴趣的朋友可以试试,有问题,告知一下!   

转载于:https://www.cnblogs.com/Richet/archive/2008/10/15/1311706.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Golang] string类型和其他类型的值的互转

问题 由于在开发过程中遇到类型转换问题&#xff0c;比如在web中某个参数是以string存在的&#xff0c;这个时候需要转换成其他类型&#xff0c;这里官方的strconv包里有这几种转换方法。 实现 有两个函数可以实现类型的互转&#xff08;以int转string为例&#xff09; 1. For…

pandas 根据单号分类_由 “猫捉老鼠”游戏联想的用户分类问题

一、说在最前 用户识别&#xff0c;用户分类&#xff0c;精准营销…这是咱们业务人员常常念叨的话。底层逻辑为无论任何营销目的&#xff0c;在营销手段上&#xff0c;越针对某一细化群体&#xff0c;达成目的的概率也就会越大。那今天就来和大家说道说道用户识别/分类的一种方…

python解释器环境中、用于表示上一次_文学人类学概说_尔雅文学人类学概说答案第四小节课后作业答案...

【判断题】对零星分数的统计资料&#xff0c;经过统计分组整理后&#xff0c;仍然不能发现其特点和规律。【单选题】小明一家三口在食用自制的臭豆腐后&#xff0c;相继出现全身乏力、头晕、头痛&#xff0c;继而出现视力模糊、眼睑下垂、复视、吞咽困难等症状&#xff0c;他们…

[Golang]slice的用法以及和数组的区别

说明 slice是go的一个语言特性&#xff0c;其实有点类似于cpp的vector&#xff0c;可变长度&#xff0c;可以扩展空间。今天详细看了下&#xff0c;做下总结。 slice本质上是一个区间&#xff0c;原型是[]T,大致的实现是这样的&#xff1a; type slice struct {first *Tlen i…

IE Firefox通用DOM

要写出在各大主流浏览器上都兼容的JS代码&#xff0c;就要关注他们的区别&#xff0c;下是IE和FF综合考虑的通用DOM&#xff01; 1.document.formName.item("itemName") 问题说明:IE下,可以使用document.formName.item("itemName")或document.formName.ele…

arraylist从大到小排序_java基础算法之二叉树排序(递归)

一、二叉树介绍在计算机科学中&#xff0c;二叉树是每个结点最多有两个子树的树结构。二叉树由各种节点组成&#xff0c;如下图所示&#xff1a;每个节点都可以有左子节点&#xff0c;右子节点每一个节点都有一个值二叉树遍历&#xff1a;二叉树的遍历分左序&#xff0c;中序&a…

uvm 形式验证_IC设计职位详解之“数字验证工程师”就业必学课程

数字验证处于数字IC设计流程的前端&#xff0c;属于数字IC设计类岗位的一种。在IC设计中&#xff0c;数字验证所占的人数比重是非常多的&#xff0c;很多大公司&#xff0c;数字前端设计工程师与验证工程师的比例已经达到1&#xff1a;3。数字验证主要分成几种层次的验证&#…

[Golang]slice值传递存在的问题

说明 因为slice是指针类型&#xff0c;所以很多人会误以为其传递的是引用&#xff0c;所以在使用的过程中会出现一些非期望的实现。 问题 在使用append函数时&#xff0c;比如以下函数&#xff1a; func sliceModify(slice []int) {// slice[0] 88slice append(slice, 6) } …

IE8给你选择的理由

记得第一次用电脑时的情景&#xff0c;有点兴奋&#xff0c;双手不知道往哪里放&#xff0c;还有点局促和不安&#xff0c;怕不小心弄坏了它。也记得第一次上网&#xff0c;那个时候的上网就是用浏览器去访问在线聊天室&#xff0c;去和不认识的人去聊天&#xff0c;在网络信息…

流畅的python目录_流畅的python python 序列

内置序列 容器类型 list 、tuple和collections.deque这些序列能放入不同的类型的数据 扁平序列 str、byets、bytearray、memoryview(内存视图)和array.array(数组) 可变序列 list、bytearray、array.array、collections.deque和memoryview 不可变序列 tuple、str和bytes 可变序…

[Golang] 用interface{}实现泛型出现的问题

说明 在做一些实现的时候&#xff0c;碰到了一个棘手的问题&#xff0c;问题是这样的&#xff0c;向一个函数里传入slice和begin,end,返回slice[begin:end]。很明显这是一个实现泛型的问题&#xff0c;但是在做具体实现的时候出现问题。 问题 根据问题&#xff0c;很容易写下如…

dwf怎么合成一个_将ActionForm拼合成一条插入和更新语句

package chs.jhsyss.form;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Date;public class Waper {public Waper(){}/*** 本方法用于将FORM对象组装成一条INSERT语句* param obj ActionForm 以及其子对象* param for…

WebHelper类

成员一&#xff1a;获取上下文对象&#xff1a; public static HttpContext GetContext() { HttpContext context HttpContext.Current; if (context null) { throw new Exception("HttpContext not found"…

关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...

数据仓库每张表的搭建&#xff0c;主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题&#xff0c;什么角色使用&#xff0c;怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题&#xff0c;拆解以下几点因素&…

[Beego] [bootstrap-paginator]实现分页功能

说明 在开发中分页功能几乎是必不可少的一项功能&#xff0c;使用beego框架开发时&#xff0c;就遇到了分页功能的需求。可能是之前版本并不支持&#xff0c;我发现有很多自己实现的分页功能的封装&#xff0c;在阅读了官方源码时&#xff0c;我发现了分页功能的封装&#xff0…

电磁波传播相位是否会变化_相位常数β与波数k是一回事吗?

1.相位常数β与波数k先明确一点&#xff1a;相位常数是指传输线&#xff0c;而波数是指平面波。1.1. 波数k wavenumber波数k&#xff1a;单位长度上有多少弧度&#xff1f;Jun.14.2019电磁波在材料中以光速 运动&#xff1a;材料的磁导率&#xff1a;材料的介电常数in free spa…

c#获取系统时间的方法

转:http://bbs.bc-cn.net/viewthread.php?tid238469 //今天DateTime.Now.Date.ToShortDateString();//昨天&#xff0c;就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDateString();//明天&#xff0c;同理&#xff0c;加一DateTime.Now.AddDays(1).ToShortDateString()…

用python画出叶子_太疯狂了!原来用粉笔画画,也可以这么美,简单几招教你,美到邻居羡慕嫉妒...

......点进来之前先让大家瞧瞧相信这是用粉笔画的吗&#xff1f;▼玫瑰花▼山茶花▼蓝色鸢尾花▼樱花树▼这一张张让人直流鼻血的作品没错这就是用色粉笔画出来的很多人问&#xff1a;是不是平时老师上课时用的粉笔呢&#xff1f;这里给大家科普下&#xff1a;色粉画&#xff0…

jsonp react 获取返回值_必须要会的 50 个React 面试题(下)

翻译&#xff1a;疯狂的技术宅原文&#xff1a;https://www.edureka.co/blog/interview-questions/react-interview-questions29. 你对受控组件和非受控组件了解多少&#xff1f;受控组件非受控组件1. 没有维持自己的状态1. 保持着自己的状态2.数据由父组件控制2.数据由 DOM 控…

ASP.Net ListBox DropdownList 不同条目 设置 背景色 和 字体颜色

转载于:https://www.cnblogs.com/sjcatsoft/archive/2008/11/08/1329787.html