单链表逆序(c#版)
2008-03-06 10:37 Franz 阅读(1163) 评论(2) 编辑 收藏 举报
昨天园子里的老赵给我出一道题,比较有意思,在这里和大家分享一下。
要求如下:
有一个单向链表,你获得了它的头节点引用,用空间复杂度为O(1)的算法,将其逆序
空间复杂度为O(1)表示你可以声明单个变量,但是不能创建一个数组等集合类型
首先构建结点
为了方便大家看我就不把单链表的所有实现代码都copy上了。因为网上单链表的实现c#版的已经很多了。但是我百度了一下逆序c#版的逆序还没有,这也是我为什么放在这里的原因。不多说了。看代码:
加下来测试一些,把i的上限改变一下1,2,3......
ok,通过!
要求如下:
有一个单向链表,你获得了它的头节点引用,用空间复杂度为O(1)的算法,将其逆序
空间复杂度为O(1)表示你可以声明单个变量,但是不能创建一个数组等集合类型
首先构建结点
1 /// <summary>
2 /// 结点类
3 /// 为方便起见,结点数据类型用int表示
4 /// </summary>
5 public class ListNode
6 {
7 public int data;
8
9 public ListNode next;
10 }
2 /// 结点类
3 /// 为方便起见,结点数据类型用int表示
4 /// </summary>
5 public class ListNode
6 {
7 public int data;
8
9 public ListNode next;
10 }
为了方便大家看我就不把单链表的所有实现代码都copy上了。因为网上单链表的实现c#版的已经很多了。但是我百度了一下逆序c#版的逆序还没有,这也是我为什么放在这里的原因。不多说了。看代码:
1 public class LinkList
2 {
3 private ListNode first; //第一个结点
4 public LinkList()
5 {
6 first = null;
7 }
8
9 public bool IsEmpty()
10 {
11 return first == null;
12 }
13
14
15 /// <summary>
16 /// 逆序
17 /// </summary>
18 /// <returns></returns>
19 public void Reversion()
20 {
21 if (first == null)
22 new Exception("Empty");
23
24 ListNode current = null;
25 ListNode temp;
26
27 while (first != null)
28 {
29 temp = new ListNode();//构建新的结点
30 temp.data = first.data;//对结点数据进行复制
31 temp.next = current;
32 current = temp;
33 first = first.next;
34 }
35 first = current;
36
37 }
38
39
40 /// <summary>
41 /// 在第k个元素之后插入x
42 /// </summary>
43 /// <param name="k"></param>
44 /// <param name="x"></param>
45 /// <returns></returns>
46 public LinkList Insert(int k, int x)
47 {
48 //如果不存在第k个元素,则引发异常OutOfBoundsException
49 if (k < 0)
50 throw (new Exception(" OutOfBoundsException()"));
51
52 ListNode pNode = first; //pNode将最终指向第k个结点
53 for (int index = 1; index < k && pNode != null; index++)
54 pNode = pNode.next;
55 if (k > 0 && pNode == null)
56 throw (new Exception(" OutOfBoundsException()"));//不存在第k个元素
57 ListNode xNode = new ListNode();
58 xNode.data = x;
59 if (k > 0)
60 {
61 //在pNode之后插入
62 xNode.next = pNode.next;
63 pNode.next = xNode;
64 }
65 else
66 {
67 //作为第一个元素插入
68 xNode.next = first;
69 first = xNode;
70 }
71 return this;
72 }
73
74 public void Clear()
75 {
76 first = null;
77 }
78
79 public void OutPut()
80 {
81 ListNode current;
82 for (current = first; current != null; current = current.next)
83 {
84 Console.Write("{0}", current.data.ToString());
85 }
86
87 Console.WriteLine();
88 }
89 }
ok,可以看到我就实现了一些基本的构建单链表的方法,看看我们的主程序2 {
3 private ListNode first; //第一个结点
4 public LinkList()
5 {
6 first = null;
7 }
8
9 public bool IsEmpty()
10 {
11 return first == null;
12 }
13
14
15 /// <summary>
16 /// 逆序
17 /// </summary>
18 /// <returns></returns>
19 public void Reversion()
20 {
21 if (first == null)
22 new Exception("Empty");
23
24 ListNode current = null;
25 ListNode temp;
26
27 while (first != null)
28 {
29 temp = new ListNode();//构建新的结点
30 temp.data = first.data;//对结点数据进行复制
31 temp.next = current;
32 current = temp;
33 first = first.next;
34 }
35 first = current;
36
37 }
38
39
40 /// <summary>
41 /// 在第k个元素之后插入x
42 /// </summary>
43 /// <param name="k"></param>
44 /// <param name="x"></param>
45 /// <returns></returns>
46 public LinkList Insert(int k, int x)
47 {
48 //如果不存在第k个元素,则引发异常OutOfBoundsException
49 if (k < 0)
50 throw (new Exception(" OutOfBoundsException()"));
51
52 ListNode pNode = first; //pNode将最终指向第k个结点
53 for (int index = 1; index < k && pNode != null; index++)
54 pNode = pNode.next;
55 if (k > 0 && pNode == null)
56 throw (new Exception(" OutOfBoundsException()"));//不存在第k个元素
57 ListNode xNode = new ListNode();
58 xNode.data = x;
59 if (k > 0)
60 {
61 //在pNode之后插入
62 xNode.next = pNode.next;
63 pNode.next = xNode;
64 }
65 else
66 {
67 //作为第一个元素插入
68 xNode.next = first;
69 first = xNode;
70 }
71 return this;
72 }
73
74 public void Clear()
75 {
76 first = null;
77 }
78
79 public void OutPut()
80 {
81 ListNode current;
82 for (current = first; current != null; current = current.next)
83 {
84 Console.Write("{0}", current.data.ToString());
85 }
86
87 Console.WriteLine();
88 }
89 }
1 static void Main(string[] args)
2 {
3
4 LinkList list = new LinkList();
5 for (int i = 0; i < 100; i++)
6 {
7 list.Insert(i, i);
8 }
9 list.OutPut();
10
11 list.Reversion();
12
13 list.OutPut();
14
15 Console.ReadLine();
16 }
2 {
3
4 LinkList list = new LinkList();
5 for (int i = 0; i < 100; i++)
6 {
7 list.Insert(i, i);
8 }
9 list.OutPut();
10
11 list.Reversion();
12
13 list.OutPut();
14
15 Console.ReadLine();
16 }
加下来测试一些,把i的上限改变一下1,2,3......
ok,通过!