資料結構之連結串列
阿新 • • 發佈:2018-12-17
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 int GetLength()
{
return _count;
}
public void Clear()
{
_head.Next = null;
_count = 0;
}
}
}