第一次用C#描述链表,和大学时用C++ 描述链表的感觉很一致,用visual studio很快就可以实现单向链表,双向链表, 和循环链表。
The reference type of C# is a key, and play the same role as pointer in C++.
上一段自己写的循环链表代码,单元测试都已经通过。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestCase1.TestCase { public class Node<T> { public T data { get; set; } public Node<T> previous { get; set; } public Node<T> next { get; set; } public Node(T data) { this.data = data; } } public class CircularLinkedList<T> { protected Node<T> head = null; protected Node<T> tail = null; int count = 0; public void Add (T element) { if (this.head == null) { this.AddFirstItem(element); } else { Node<T> newNode = new Node<T>(element); this.tail.next = newNode; newNode.previous = this.tail; newNode.next = this.head; this.tail = newNode; // important logic this.head.previous = this.tail; } count++; } public void Remove(T element) { Node<T> targetNode = this.Find(element); if (targetNode != null) { if (count == 1) { this.head = null; this.tail = null; } else if (targetNode == this.head) { this.head = targetNode.next; this.head.previous = targetNode.previous; targetNode.next = null; targetNode.previous = null; // important logic this.tail.next = this.head; } else if (targetNode == this.tail) { this.tail = targetNode.previous; this.tail.next = targetNode.next; targetNode.next = null; targetNode.previous = null; this.head.previous = this.tail; } else { targetNode.previous.next = targetNode.next; targetNode.next.previous = targetNode.previous; targetNode.previous = null; targetNode.next = null; } count--; } } private Node<T> Find(T element) { Node<T> result = null; Node<T> current = this.head; while(current != null) { if (Comparer<T>.Equals(current.data, element)) { result = current; break; } else { current = current.next; if (current == this.head) { break; } } } return result; } private void AddFirstItem(T element) { Node<T> newNode = new Node<T>(element); if (this.head == null) { this.head = newNode; this.head.next = this.head; this.tail = this.head; this.tail.next = this.head; this.tail.previous = this.head; this.head.previous = this.tail; } } public void PrintNodes() { Node<T> temp = this.head; while(temp != null) { Console.WriteLine(temp.data); temp = temp.next; if (temp == this.head) { break; } } } } }