配套的单链表在另一篇博客。
和上一篇快慢指针原理基本相同。
核心问题就是下面的那个While判断条件,和最下面的奇数链表和偶数链表的问题。
然后是判断单链表的元素个数是奇数还是偶数的问题,观察我下面画的表。当元素个数为奇数的时候,First停止时,Second位置正好就是中间的位置,问题是元素个数为偶数的时候,First停止时,中间有两个位置,我选择的返回的是第二个位置。
/// <summary>
/// 取得中间元素
/// </summary>
/// <returns></returns>
public Link<T> GetMiddleElement()
{
//首先建立两个指针,C++叫指针,C#叫引用。
//First走两步,Second走一步,等First走到终点的时候,Second走的路程正好是First的一半,即单链表的中间位置
Link<T> First = this.Head;
Link<T> Second = this.Head;
if (Head.Next == null)
{
throw new Exception("单链表为空");
}
//因为First要往后移动两位
//首先要考虑,First在上一次成功移动后,是不是到达了单链表的末端,
//如果刚好到达了末端的话,也就说明First=null,那么First就没有Next了,也就没有First.Next.Next了
//如果没有到达末端的话,说明First.Next != null
//然后综合两者得出如下While语句的条件
while (First != null && First.Next != null)
{
First = First.Next.Next;
Second = Second.Next;
}
//解决奇数偶数问题
if (Count % 2 == 0)
{
return Second.Next;
}
return Second;
}
}