单链表的实现

//最近动手把单链表的操作实现了一遍:

//单链表中存放的结点类:

    public class Node<T>
    {
        private T data;     //数据域
        private Node<T> next; //引用域


        //构造函数
        public Node(T val,Node<T> p)
        {
            data = val;
            next = p;
        }


        //构造函数
        public Node(T val)
        {
            data = val;
        }


        //构造函数
        public Node(Node<T> p)
        {
            next = p;
        }

        //构造函数
        public Node()
        {
            data = default(T);
            next = null;
        }

        //属性 data
        public T Data
        {
            get { return data; }
            set { data = value; }
        }

        //属性 next
        public Node<T> Next
        {
            get { return next; }
            set { next = value; }
        }
    }

//单链表类 主要属性 是头引用 (头结点),所实现的接口如下:

 public interface IListDS<T>
    {
        //获取表的长度
        int GetLength();
        //清空表
        void Clear();
        //判断表是否为空
        bool IsEmpty();
        //向表尾追加
        void Append(T item);
        //在指定位置插入元素
        void Insert(T item, int i);
        //删除指定位置元素
        T Delete(int i);
        //获得在指定位置的元素
        T GetElem(int i);
        //获取元素在表中的位置
        int Locate(T value);
    }

//具体的单链表类如下:

public class LinkList<T> : IListDS<T>
    {

        //头引用
        public Node<T> head;

        //头引用属性
        public Node<T> Head
        {
            get
            {
                return head;
            }
            set
            {
                head = value;
            }
        }


        //构造函数
        public LinkList()
        {
            head = null;
        }
        
        //实现接口方法...

    
}

//具体的方法实现:

1.//Is Empty //GetLength()//Clear()

public bool IsEmpty()
{
     return this.head == null;  
}
public int GetLength()  
{
      if(IsEmpty())
      {
          return -1;
      }
      Node<T> p = head;  
      int j =1;
      while(p.Next!=null)
       {
             p=p.Next;
             ++j;
       }
       return j;
}    

public void Clear()
{
  this.head = null;
}

//2.Append 向链表末尾追加结点

public void Append(T item)
{
  Node<T> target = new Node<T>(item);
  if(IsEmpty())
  {
    this.head = target;
    return;
  }
  Node<T> p = head;
  while(p.Next!=null)
  {
    p= p.Next;
  }
  p.Next = target;
}

//3.Insert 插入结点  有两种方式 在指定位置之前插入 和 在指定位置之后插入

  //3.1 在指定位置之前插入:

        public void Insert(T item, int i)
        {
            //    throw new NotImplementedException();
            if (IsEmpty() || i < 1)
            {
                return;
            }

            if (i == 1)
            {
                Node<T> q = new Node<T>(item);
                q.Next = head;
                head = q;
                return;
            }

            Node<T> p = head;
            Node<T> r = new Node<T>();

            //r 存储第i个结点的前一个结点
            int j = 1;
            while (p.Next != null && j < i)
            {
                r = p;
                p = p.Next;
                ++j;
            }

            if (j == i)
            {
                Node<T> q = new Node<T>(item);
                q.Next = p;
                r.Next = q;
            }

        }

  //3.2在指定位置之后插入

 1      public void InsertAfter(T item,int i)
 2         {
 3             if (IsEmpty() || i < 1)
 4             {
 5                 return;
 6             }
 7 
 8             //首先找到第i个结点  和第i+1个结点(i.Next)
 9 
10             Node<T> p = head;
11             int j = 1;
12 
13             while (p.Next != null && j < i)
14             {
15                 p = p.Next;
16                 ++j;
17             }
18 
19 
20             if (j == i )
21             {
22                 Node<T> target = new Node<T>(item);
23                 target.Next = p.Next;
24                 p.Next = target;
25             }
26 
27         }

//4.删除 第i个结点

 1        public T Delete(int i)
 2         {
 3             //
 4             //throw new NotImplementedException();
 5             if (IsEmpty() || i < 0)
 6             {
 7                 return default(T);
 8             }
 9 
10             //记录到第i个结点
11             Node<T> p = head;
12 
13             //记录第i-1个结点
14             Node<T> q = new Node<T>();
15 
      
         if(i==1)
          {
            q = head;
head = q.Next;
            return q.Data;
          }


16 int j = 1; 17 while (p.Next != null&& j<i) 18 { 19 q = p; 20 p = p.Next; 21 ++j; 22 } 23 24 if (j == i) 25 { 26 q.Next = p.Next; 27 return p.Data; 28 } 29 30 return default(T); 31 32 }

//5.取表元 

public T GetElem(int i)
{
     if(IsEmpty()||i<1)
     {
        return default(T);
     }        
      if(i==1)
       {
          return head.Data;
       }
       Node<T> p = head;
       int j=1;
       while(p.Next!=null && j<i)       //先找到指定位置i的结点
       {
           p=p.Next;
           ++j;
       }
       if(j==i)
       {
           return p.Data;
       }
       return default(T);
}        

//6.Locate  //获取元素在表中的位置

public int Locate(T item)
{
      if(IsEmpty())
      return -1;
      Node<T> p = head;
      int j =1;
      while(p.Next!=null)
      {
           if(p.Data.Equals(item))
           break;
           p=p.Next;
           ++j;
      }    
      return j;
}

 

posted on 2017-03-07 17:10  许清池  阅读(199)  评论(0编辑  收藏  举报

导航