我正在尝试编写代码来查找链表中循环的开头。 这是我的代码:
#include <iostream>
template <class T>
class LinkedList
{
public:
struct node
{
T data;
node* next;
};
node* head;
LinkedList() : head(NULL){};
void AppendToTail(T data);
void InsertToHead(T data);
void RemoveDuplicates();
void PrintList();
T lastNthNode(int N);
bool operator==(const LinkedList<T>& L);
node* FindBeginningNodeLoop();
};
template <class T>
node* LinkedList<T>::FindBeginningNodeLoop()
{
if (head == NULL)
return NULL;
node* slow = head;
node* fast = head;
while (fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
if (fast == NULL)
return NULL;
slow = head;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
编译器出现以下错误:
1&GT; main.cpp中 1&gt; c:\ users ... \ linkedlist.h(177):错误C2143:语法错误:缺少&#39 ;;&#39;之前&#39; *&#39; 1&gt; c:\ users ... \ linkedlist.h(177):错误C2065:&#39; T&#39; :未声明的标识符 1&gt; c:\ users ... \ linkedlist.h(177):错误C2923:&#39; LinkedList&#39; :&#39; T&#39;不是参数&#39; T&#39;的有效模板类型参数。 1&gt; c:\ users ... \ linkedlist.h(200):错误C2509:&#39; FindBeginningNodeLoop&#39; :成员函数未在&#39; LinkedList&#39;中声明 1 GT; c:\ users ... \ linkedlist.h(5):参见&#39; LinkedList&#39;
的声明我找不到问题。任何帮助是极大的赞赏。 感谢。
答案 0 :(得分:2)
node
是LinkedList
的内部类型。你有两个选择:
使用尾随返回类型,其中返回类型在类的范围内:
LinkedList<T>::FindBeginningNodeLoop()->node* { .... }
或者在类定义之外引用它时使用类的范围:
template <class T>
typename LinkedList<T>::node* LinkedList<T>::FindBeginningNodeLoop() { .... }
^^^^^^^^^^^^^^^
最重要的是,您需要使用typename
来指定node
是一种类型(有关详细信息,请参阅when is the typename
keyword necessary。)
如果编译器不支持C ++ 11或c ++ 14,则需要第二个版本。
答案 1 :(得分:1)
您在node
课程中声明了结构LinkedList
。名称node
本身不可见,每次在类定义之外使用时都应以LinkedList<T>::
开头。
此外,还需要使用typename
关键字来区分类型和同名的(最终存在的)变量。