单链表的应用 就地逆置
生活随笔
收集整理的這篇文章主要介紹了
单链表的应用 就地逆置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】試實現線性表的就地逆置算法,即在原表的存儲空間將線性表(a1,a2,a3....an)逆置為(an...a3,a2,a1).
? ?[分析]就地逆置就是不需要額外申請結點空間,只需要利用原來的表中的結點空間。若對順序表中的元素進行逆置,可 ? 以借助“交換”前后相應元素的方法實現,但是對于單鏈表就不能“交換”,時間復雜度就會達到O(n^2)。
? 【思想】逆置后的單鏈表初始化為空表,表中的結點不是新生成的,而是從原鏈表中依次“刪除”,再逐個以頭插法放置到逆置表中,如此循環,直至原鏈表為空表止。
#include <stdio.h> #include <stdlib.h> #define ElemType char typedef struct Node /*結點類型定義*/ { ElemType data;struct Node * next; }Node, *LinkList; /* LinkList為結構指針類型*/LinkList CreateFromTail() /*通過鍵盤輸入表中元素值,利用尾插法建單鏈表,并返回該單鏈表頭指針L*/ { LinkList L;Node *r, *s;char c;int flag =1; /*設置一個標志,初值為1,當輸入"$"時,flag為0,建表結束*/L=(Node * )malloc(sizeof(Node)); L->next=NULL; /*為頭結點分配存儲空間,建立空的單鏈表L*/r=L; /*r指針動態指向鏈表的當前表尾,以便于做尾插入,其初值指向頭結點*/while(flag) /*循環輸入表中元素值,將建立新結點s插入表尾*/{c=getchar();if(c!='$'){s=(Node*)malloc(sizeof(Node));s->data=c;r->next=s;r=s;}else{flag=0;r->next=NULL; /*將最后一個結點的next鏈域置為空,表示鏈表的結束*/}} return L; } void ReverseList(LinkList L) { Node *p,*q;p=L->next;L->next=NULL;while(p!=NULL){ q=p->next; /*q指針保留p->next得值*/p->next=L->next;L->next=p; /*將p結點頭插入到單鏈表L中*/p=q; /*p指向下一個要插入的結點*/} }int main() {LinkList l;Node *p;printf("用尾插法建立單鏈表,請輸入鏈表數據,以$結束!\n");l = CreateFromTail();printf("輸入的單鏈表為:\n");p = l->next;while(p!=NULL){printf("%c\n",p->data);p=p->next;}ReverseList(l);printf("逆置后的單鏈表為:\n");p = l->next;while(p!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");return 0; }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的单链表的应用 就地逆置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iangularjs 模板,Angula
- 下一篇: zbbz插件使用教程_cad坐标标注插件