http://blog.csdn.net/yxh0823/article/details/6080163
設鏈表節點爲
- typedef struct tagListNode{
- int data;
- struct tagListNode* next;
- }ListNode, *List;
- typedef struct tagListNode{
- int data;
- struct tagListNode* next;
- }ListNode, *List;
要求將一帶鏈表頭List head的單向鏈表逆序。
分析:
1). 若鏈表爲空或只有一個元素,則直接返回;
2). 設置兩個前後相鄰的指針p,q. 將p所指向的節點作爲q指向節點的後繼;
3). 重複2),直到q爲空
4). 調整鏈表頭和鏈表尾
示例:以逆序A->B->C->D爲例,圖示如下
實現及測試代碼如下:
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct tagListNode{
- int data;
- struct tagListNode* next;
- }ListNode, *List;
- void PrintList(List head);
- List ReverseList(List head);
- int main()
- {
- //分配鏈表頭結點
- ListNode *head;
- head = (ListNode*)malloc(sizeof (ListNode));
- head->next = NULL;
- head->data = -1;
- //將[1,10]加入鏈表
- int i;
- ListNode *p, *q;
- p = head;
- for ( int i = 1; i <= 10; i++)
- {
- q = (ListNode *)malloc(sizeof (ListNode));
- q->data = i;
- q->next = NULL;
- p->next = q;
- p = q;
- }
- PrintList(head); /*輸出原始鏈表*/
- head = ReverseList(head); /*逆序鏈表*/
- PrintList(head); /*輸出逆序後的鏈表*/
- return 0;
- }
- 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;
- }
- void PrintList(List head)
- {
- ListNode* p = head->next;
- while (p != NULL)
- {
- printf("%d " , p->data);
- p = p->next;
- }
- printf("/n" );
- }