日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

發布時間:2024/1/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

## 問題描述

> 試編寫在帶頭結點的單鏈表就地逆置,所謂“就地”是指輔助空間為O(1)

## 算法思想1

> 將頭結點摘下,然后從第一個結點開始,依次插入到頭節點的后面(類似與頭插法創建單鏈表),直到最后一個結點為止,實現了鏈表的逆置。如下圖所示:

![逆置單鏈表](https://box.kancloud.cn/2016-03-14_56e6694839f4a.jpg "")

## 算法描述1

~~~

void RverList(LNode *head){

LNode *p=head->next;

LNode *q=p->next;

head->next=NULL;

while(p){

q=p->next;

p->next=head->next;

head->next=p;

p=q;

}

}

~~~

具體代碼見附件1。

## 算法思想2

> 引用三個指針,分別為指向當前結點的指針p,指向前驅結點的指針pre,指向后繼結點的指針q。首先單獨摘下頭節點,然后讓指針p所指結點的next域指向前驅結點即可完成一次逆置過程;但是因為需要逆置整條單鏈表,因此將這三個指針分別后移,繼續重復上一次的過程,具體如下圖所示:

![逆置單鏈表](https://box.kancloud.cn/2016-03-14_56e6694849a5a.jpg "")

## 算法描述2

~~~

void RverList(LNode *head){

LNode *pre=head;

LNode *p=pre->next;

LNode *q=p->next;

p->next=NULL;

while(q){

pre=p;

p=q;

q=q->next;

p->next=pre;

}

head->next=p;

}

~~~

具體代碼見附件2。

## 附件1

~~~

#include

#include

typedef int ElemType;

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode, *LinkList;

LinkList CreatList(LNode*);

void RverList(LNode*);

void Print(LNode*);

int main(int argc, char* argv[])

{

LNode *head;

head=(LNode*)malloc(sizeof(LNode));

head->next=NULL;

head=CreatList(head);

Print(head);

RverList(head);

Print(head);

return 0;

}

//頭插法建立單鏈表

LinkList CreatList(LNode *head)

{

LNode *L;

ElemType x;

scanf("%d",&x);

while(x!=999){

L=(LNode*)malloc(sizeof(LNode));

L->data=x;

L->next=head->next;

head->next=L;

scanf("%d",&x);

}

return head;

}

//就地逆置單鏈表

void RverList(LNode *head){

LNode *p=head->next;

LNode *q=p->next;

head->next=NULL;

while(p){

q=p->next;

p->next=head->next;

head->next=p;

p=q;

}

}

//打印全部結點

void Print(LNode *head)

{

LNode *p=head->next;

while(p){

printf("%4d",p->data);

p=p->next;

}

printf("\n");

}

~~~

## 附件2

~~~

#include

#include

typedef int ElemType;

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode, *LinkList;

LinkList CreatList(LNode*);

void RverList(LNode*);

void Print(LNode*);

int main(int argc, char* argv[])

{

LNode *head;

head=(LNode*)malloc(sizeof(LNode));

head->next=NULL;

head=CreatList(head);

Print(head);

RverList(head);

Print(head);

return 0;

}

//頭插法創建單鏈表

LinkList CreatList(LNode *head)

{

LNode *L;

ElemType x;

scanf("%d",&x);

while(x!=999){

L=(LNode*)malloc(sizeof(LNode));

L->data=x;

L->next=head->next;

head->next=L;

scanf("%d",&x);

}

return head;

}

//就地逆置單鏈表

void RverList(LNode *head){

LNode *pre=head;

LNode *p=pre->next;

LNode *q=p->next;

p->next=NULL;

while(q){

pre=p;

p=q;

q=q->next;

p->next=pre;

}

head->next=p;

}

//打印全部結點

void Print(LNode *head)

{

LNode *p=head->next;

while(p){

printf("%4d",p->data);

p=p->next;

}

printf("\n");

}

~~~

總結

以上是生活随笔為你收集整理的无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。