算法思想:使用两个指针first和second,只是first每次走一步,second每次走两步,这样当second达到链表尾部时,first刚好在链表的中间。
static Link GetMiddleOne(Link head) {
Link first = head;
Link second = head;
while (first != null && first.Next != null) {
first = first.Next.Next;
second = second.Next;
}
return second;
}
但是,这道题目有个地方需要注意,就是对于链表元素个数为奇数,以上算法成立。如果链表元素个数为偶数,那么在返回second的同时,还要返回second.Next也就是下一个元素,它俩都算是单链表的中间元素。 下面是加强版的算法,无论奇数偶数,一概通杀:
static void Main(string[] args) {
Link head = GenerateLink();
bool isOdd = true;
Link middle = GetMiddleOne(head, ref isOdd);
if (isOdd) {
Console.WriteLine(middle.Data);
} else {
Console.WriteLine(middle.Data);
Console.WriteLine(middle.Next.Data);
}
Console.Read();
}
static Link GetMiddleOne(Link head, ref bool isOdd) {
Link first = head;
Link second = head;
while (first != null && first.Next != null) {
first = first.Next.Next;
second = second.Next;
}
if (first != null)
isOdd = false;
return second;
}