面试百题024——链表逆序

转载:http://blog.csdn.net/niuer09/article/details/5961004

单链表

要求将一带链表头List head的单向链表逆序。

分析:

  1). 若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

  3). 重复2),直到q为空

  4). 调整链表头和链表尾

示例:以逆序A->B->C->D为例,图示如下

链表结构

typedef struct tagListNode{
    int data;
    struct tagListNode* next;
}ListNode, *List;

List ReverseList(List head)  
{  
    if(head->next == NULL || head->next->next == NULL)    
    {  
       return head;   /*链表为空或只有一个元素则直接返回*/  
    }  
  
    ListNode *t = NULL,  
             *p = head->next,  
             *q = head->next->next;  
    while(q != NULL)  
    {          
      t = q->next;  
      q->next = p;  
      p = q;  
      q = t;  
    }  
  
    /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/  
    head->next->next = NULL;  /*设置链表尾*/  
    head->next = p;           /*调整链表头*/  
    return head;  
}

双向链表

typedef struct dnode
{
        int data;
        struct dnode *prior;
        struct dnode *next;
}DNode;

DNode *reverseDNode(DNode *head)
{
        DNode *p = head->next;
        DNode *q = p->next;
        DNode *r = q->next;
        if(head == NULL || head->next ==NULL)
                return head;
        p->next = NULL;
        while(r != NULL)
        {
                q->next = p;
                p->prior = q;
                p = q;
                q = r;
                r = r->next;
        }
        q->next = p;
        p->prior = q;
        head->next = q;
        q->prior = head;
        return head;
}
posted @ 2012-10-07 17:10  三块钱的其其  阅读(150)  评论(0编辑  收藏  举报