有一个长度大于2的单链表L,请用C++设计一个算法Middle(LinkList<T>& L) : 查找L中间位置的元素。 例如,L=(1,2,3),返回元素为2;L=(1,2,3,4),返回元素为2
时间: 2024-10-25 09:14:49 浏览: 17
LinkList单文件_一个简单单链表_
要设计一个C++算法来查找单链表L的中间元素,可以采用快慢指针的方法。创建两个指针,一个普通指针(slow)初始化为头节点,另一个快速指针(fast)也初始化为头节点。然后让快速指针每次移动两步,而慢速指针每次移动一步,直到快速指针到达链表的末尾。
当快速指针达到链表末尾时,慢速指针会停在链表的中间位置。这是因为如果链表长度是奇数,慢速指针会在最后一个节点之前;如果是偶数长度,慢速指针会正好位于中间两个节点之间。
以下是具体的C++代码实现:
```cpp
template <typename T>
class ListNode {
public:
T val;
ListNode<T> *next;
ListNode(T x) : val(x), next(NULL) {}
};
ListNode<T>* Middle(ListNode<T>& L) {
if (L == nullptr || L->next == nullptr) { // 如果链表为空或只有一个节点
return L;
}
ListNode<T>* slow = L; // 慢速指针
ListNode<T>* fast = L; // 快速指针
while (fast && fast->next) { // 当快速指针还有下一个节点
fast = fast->next->next; // 快速指针前进两步
slow = slow->next; // 慢速指针前进一步
}
return slow; // 返回慢速指针指向的位置,即链表的中间元素
}
```
阅读全文