单链表的逆转:迭代形式和递归形式

来源:互联网 发布:下载ppt的软件 编辑:程序博客网 时间:2024/06/05 02:23
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;    }