看到一个反转链表的题目,先在纸上写,竟然写了两次,再看都混乱不对。于是晚上上机调试,还是改了两三次。终于搞定了。(这水平,真是不好意思说自己已经干了这么久了)
首先定义如下数据结构:
struct LNode
{
int data;
LNode* next;
LNode()
{
data = 0;
next = NULL;
}
};
三个函数,分别用来初始化,打印和反转链表(这里暂且不考虑释放内存的问题):
void InitLinkList(LNode* head)
{
assert(head != NULL);
LNode* p = head;
for (int i = 0; i < 10; i++)
{
LNode* node = new LNode;
node->data = i;
node->next = NULL;
p->next = node;
p = node;
}
}
void PrintLinkList(LNode* head)
{
assert(head != NULL);
LNode* p = head->next;
while (p != NULL)
{
std::cout << p->data << " ";
p = p->next;
}
std::cout << std::endl;
}
void ReverseLinkList(LNode* head)
{
assert(head != NULL);
// 空链表或只有一个节点的链表
if (head->next == NULL || head->next->next == NULL)
{
return;
}
LNode* p = head->next->next; // 指向第二个节点
head->next->next = NULL; // 第一个节点注定是链表尾
while (p != NULL)
{
LNode* q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
}
main函数里如下:
void main()
{
LNode head;
InitLinkList(&head);
PrintLinkList(&head);
ReverseLinkList(&head);
PrintLinkList(&head);
}
测试了一下,基本没有问题。不过让我去面试( 考的就是reverse函数),就丢死人了。