反转单链表问题

来源:互联网 发布:淘宝客推广什么产品好 编辑:程序博客网 时间:2024/03/02 13:43

反转单链表是一道经典的面试题。


以下分别通过栈,循环以及递归方法实现反转单链表。


栈实现:由于栈后进先出的特性,实现反转十分简单,在出栈时逐个添加到头结点后面即可。

循环实现:再循环实现中需要定义三个变量分别指向前一个,现在和之后处理的节点。

递归实现:递归实现比较抽象,需要画图帮助理解各语句的执行顺序。

//通过栈实现,要求O(N)空间void reverse(node* list)//list有头结点{    typedef struct stack    {        node* val;        struct stack* next;    }snode;    snode* s;    initiate(s);    node* p;     snode* t;    p=list->next;    while(p)    {        t=(snode*)malloc(sizeof(snode));        t->val=p;        t->next=s->next;        s->next=t;        p=p->next;    }    t->next=NULL;    p=list;    while(t=s->next)    {        p->next=s->next->val;        s->next=s->next->next;        free(t);        p=p->next;    }    p->next=NULL;}

//循环实现,要求常数空间,从头节点向后处理void reverse( node* list ){p = list->next;if (p){t = p->next;if (t)m = t->next;}while (p!=NULL&&t!=NULL){t->next = p;p = t;t = m;if (t != NULL)m = m->next;}list->next->next = NULL;list->next = p;}    

//递归实现,从尾部向头部处理(不用头指针)void reverse(Node** (&p)) //使用二重指针以修改指针本身{  node *rest;  if(p) return;//0个元素  if(rest=p->next) return;//1个元素  reverse(&rest);//2个元素以上进入  p->next->next=p;  p->next=NULL;  p=rest;//通过二级指针修改rest返回值,使其始终指向最后一个元素}