面试百题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; }