生活随笔
收集整理的這篇文章主要介紹了
链表逆序的原理及实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/wangqing_12345/article/details/51757294
尾插法建立鏈表,帶頭結點
設鏈表節點為
typedef struct node {
??? int data;
??? struct node *next;
}node_t, *pnode_t;
要求將一帶鏈表頭List head的單向鏈表逆序。
分析:
? 1). 若鏈表為空或只有一個元素,則直接返回;
??2). 設置兩個前后相鄰的指針p,q. 將p所指向的節點作為q指向節點的后繼;
? 3). 重復2),直到q為空
? 4). 調整鏈表頭和鏈表尾
示例:以逆序A->B->C->D為例,圖示如下
#include?<stdio.h>
#include?<stdlib.h>
#include?<string.h>
#define?LEN?10
typedef struct node?{
????int?data;
????struct node?*pnext;
}?node_t,?*pnode_t;
pnode_t create_link()
{
????int?i;
????pnode_t phead;
????phead?=?(pnode_t)malloc(sizeof(node_t));?????
????if?(phead?==?NULL)?{
????????printf("malloc fail.\n");
????????exit(-1);
????}
????memset(phead,?0,?sizeof(node_t));
????pnode_t ptail?=?phead;
????for?(i?=?0;?i?<?LEN;?i++)?{
????????pnode_t????pnew?=?(pnode_t)malloc(sizeof(node_t));
????????if?(pnew?==?NULL)?{
????????????printf("malloc fail.\n");
????????????exit(-1);
????????}
????????memset(pnew,?0,?sizeof(node_t));
????????pnew->data?=?i+1;
????????pnew->pnext?=?NULL;
????????ptail->pnext?=?pnew;
????????ptail?=?pnew;
????}
????return phead;
}
void print_link(pnode_t phead)
{
????pnode_t p?=?phead->pnext;
????while?(p?!=?NULL)?{
????????printf("%d ",?p->data);
????????p?=?p->pnext;
????}
????printf("\n");
}
void reverse_link(pnode_t phead)
{
????pnode_t p,?q,?ptmp;
????p?=?phead->pnext;
????q?=?phead->pnext->pnext;
????ptmp?=?NULL;
????while?(q?!=?NULL)?{
????????ptmp?=?q->pnext;
????????q->pnext?=?p;
????????p?=?q;
????????q?=?ptmp;
????}
????phead->pnext->pnext?=?NULL;
????phead->pnext?=?p;
}
int?main(int?argc,?char?*argv[])
{
????pnode_t phead?=?NULL;
????phead?=?create_link();
????print_link(phead);
????reverse_link(phead);
????print_link(phead);
????return 0;
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的链表逆序的原理及实例的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。