struct Node
{
int num;
Node *next;
}; // 注意这个地方,这个分号占一半的分!!!
1.迭代版的:(明明知道是这样子,但写的时候,要想很久,常考,背!!!)
/* 注意 head是头结点 */
Node *ReverseLink( Node *head)
{
if(NULL == head)
return NULL;
Node *p, *q;
p = head->next;
head->next = NULL;
while(p)
{
q = p->next; // p指向链表的第一个结点
p->next = head->next; // 利用头插法将结点依次插入到链表的头部
head->next = p;
p = q;
}
return head;
}
简单描述一下,每次取一个结点p(p指向的节点,我们简称p),让这个结点指向head的下一位,同时让head指向p,就是这么简单,其实就是一个头插法,把后面的结点依次插入到最前面。
这里需要注意的是,最开始取的结点p,是head是下一位,然后操作是,p指向本身,然后head指向p。没毛病~。
2. 递归版:
/* 这里的head不是头结点,是第一个结点*/
Node *Reverse_Link_Recursive(Node *head)
{
if(head == NULL || head->next == NULL)
return head;
Node* p1 = head;
Node* p2 = p1->next; //p2其实记录的下一步递归过程后的尾结点
Head = recursive_Link(p2);
p2->next = p1;
p1->next = NULL;
return head;
}