DS&A 2.Linked List
Define Prototype


/// <summary>
/// Define LinkedNode Object
/// </summary>
public class LinkedNode
{
private LinkedNode _next;
private Object _value;
public LinkedNode()
{
}
public LinkedNode(Object value, LinkedNode next)
{
this._next = next;
this._value = value;
}
public LinkedNode(Object value)
: this(value, null)
{
}
public LinkedNode Next
{
get { return _next; }
set { _next = value; }
}
public object Value
{
get { return _value; }
//set { _value = value; }
}
}
字段的定义


private int _length;
private LinkedNode _head;
private LinkedNode _tail;
public int Length
{
get { return _length; }
}
public LinkedListV4()
{
this._head = null;
this._tail = null;
}
在头部插入


public void AddAtFirst(Object value)
{
if (this._head == null)
{
this._head = new LinkedNode(value);
this._tail = this._head;
this._length++;
}
else
{
LinkedNode tmpNode = new LinkedNode(value, this._head);
this._head = tmpNode;
this._length++;
}
}


/// <summary>
/// V2,利用tail结点。
/// </summary>
/// <param name="value"></param>
public void AddAtEnd(Object value)
{
if (this._head == null)
{
this._head = new LinkedNode(value);
this._tail = this._head;
this._length++;
}
else
{
LinkedNode newNode = new LinkedNode(value);
this._tail.Next = newNode;
this._tail = newNode;
this._length++;
}
}


//反转
public int Reverse()
{
int count = 0;
LinkedNode pNode = this._head;
while (pNode.Next != null)
{
LinkedNode tNode = pNode.Next;
pNode.Next = pNode.Next.Next;
tNode.Next = this._head;
this._head = tNode;
count++;
}
return count;
}


public void BubbleSort()
{
LinkedNode tNode = this._head;
LinkedNode dNode = this._head;
while (tNode.Next != null)
{
dNode = tNode;
LinkedNode dpNode = dNode;//记录父
while (dNode.Next != null)
{
//如果发生交换dNode已向后移,不用再重新赋值
if (Convert.ToInt32(dNode.Value) > Convert.ToInt32(dNode.Next.Value))
{
//swap;
if (dNode == this._head)//头结点
{
LinkedNode tmpNode = dNode;
this._head = dNode.Next;
dNode.Next = dNode;
}
else
{
LinkedNode tmpNode = dNode;
dpNode.Next = dNode.Next;
tmpNode.Next = dpNode.Next.Next;
dpNode.Next.Next = tmpNode;
}
dpNode = dpNode.Next;
}
else
{
dpNode = dNode;
dNode = dNode.Next;
}
}
tNode = tNode.Next;
}
}


//判断是否为循环链表
//方法1:遍历,并且为每个点写上一个标记,如果该标记重复出现,说明循环。
//方法2:创建两个指针,分别指向当前结点和该结点的后一个结点。
public bool IsLoop()
{
LinkedNode pNode = this._head;
LinkedNode nNode = this._head.Next;
while (nNode != null)
{
if (nNode.Next == pNode)
{
return true;
}
pNode = pNode.Next;
nNode = nNode.Next;
}
return false;
}