1. 程式人生 > >資料結構之連結串列

資料結構之連結串列

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; } } }