单链表

相对于数组来说:

优点: 通过索引(数组下标)快地访问数组元素;
缺点: 插入/删除元素需要对数组进行调整, 效率低;

而链表:
优点:插入/删除速度快而且用对整链表进行调整;
缺点:只能进行顺序访问能随机访问(像数组样用下标);

所链表些需要快速插入/删除而太关心或者需要随机访问情况下使用.

单链表:

1、链接存储方法
链接方式存储的线性表简称为链表.

链表的具体存储表示为:

(1) 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

(2)链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构
2、链表的结点结构
┌───┬───┐
│data │next │
└───┴───┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
注意:
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
using System;
namespace Singly_Linked_List
{
    class Program
    {
        static void Main(string[] args)
        {
            SinglyLinkedList lst = new SinglyLinkedList();
             lst.Add(1);
             lst.Add(2);
             lst.Add(3);
             lst.Add(4);
             lst.Add(5);
             lst.Add(6);
            lst.DeleteNext();
            lst.DeleteNext();
            lst.DeleteNext();
            Console.WriteLine( lst.ToString());
            Console.Read();
        }
    }
    class SinglyLinkedList
    {
        //元素个数
        private int count;
        //尾指针
        private Node next;
        private Node Temp;
        //增加元素
        public void Add(object value)
        {
            Node newNode = new Node(value);
            if (this.next == null)
                //链表为空
                this.next = newNode;

            else
            {//链表不为空,把元素增加到链表结尾

                if (Temp == null)
                {
                    this.next.next = newNode;
                    Temp = newNode;
                }
                else
                {

                    Temp.next = newNode;
                    Temp = newNode;
                }
            }



            //也可以用下面这种方法
            //if (this.next == null)
            //    //链表为空
            //    this.next = newNode;
            //else
            //{ 
            //if (this.next.next == null)
            //    this.next.next = newNode;
            //else {

            //    Node n1 = this.next.next;

            //    for (int i = 1; i < count; i++)
            //    {
            //        if (n1.next == null)

            //            n1.next = newNode;

            //        else
            //            n1 = n1.next;


            //    }

            //}
            //}
                count++;
            
        
        }

     
     
        public override string ToString()
        {
            if (this.next == null)
            {
                return string.Empty;
            }
            string s = "";
            Node temp = this.next;
            for (int i = 0; i < count; i++)
            {
                s += temp.ToString() + "    ";
                temp = temp.next;
            }
            return s;
        }


        //链表长度
        public int Count
        {
            get { return count; }
        }

       // 删除
        public int DeleteNext()
        {
            if (  this.next == null)
                return 0;

            if (this.next.next == null)
                this.next = null;
            else
            this.next = this.next.next;

            count--;
            return 1;
        }

        private class Node
        {
            public Node(object value)
            {
                item = value;
            }
            //存放数据
            public object item;
            public SinglyLinkedList.Node next;
            public override string ToString()
            {
                return item.ToString();
            }
        }
    }

}

 

运行结果:

posted @ 2014-06-24 21:55  欢呼雀跃  阅读(215)  评论(0)    收藏  举报