當前位置:首頁 » 服務存儲 » 單鏈表逆序存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

單鏈表逆序存儲

發布時間: 2022-12-11 18:32:05

1. 單鏈表實現鏈表逆序(詳細思路)

這道題,是我畢業前在北京找實習真實碰到的一個面試題。
逆序誰不會是吧,啥?不能用數組,不能用字元串,集合。只能用node自己構建鏈表。
嗯,好像有點兒印象,大學學數據結構的時候都學過。
但是那會兒真是全忘了,面試官很有耐心,還教了我。唉。:)

分三步,第一步先實現鏈表,第二步順序列印,第三步逆序列印,逆序列印這里有兩種方案。1. 鏈表反轉,順序列印。2. 鏈表不動,逆序列印

add方法要點:

順序就是用while輸出value就行,逆序就是寫個遞歸倒著輸出value就行
重點說一下我做反轉鏈表的思路
所有思路都在圖片裡面了。
PS:這應該是我最後一次主動在網上畫圖,太費勁兒了,以後還是手畫。

2. 鍵盤輸入一組數字,用單鏈表形式存儲,輸入完成後分別按順序和逆序輸出所輸入數字。

樓主你好
具體代碼如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX 80

typedef struct node
{
int data;
struct node *next;
}N;

N *head=(N *)malloc(sizeof(N));//創建頭結點

void Creat()
{
N *p;//用於插入新節點
N *r=head;//尾指針 開始指向頭結點

printf("請輸入任意個數據(用回車結束輸入、空格間隔:1 2 3……)\n:");
do{
p=(N *)malloc(sizeof(N));
scanf("%d",&p->data);
r->next=p;
r=p;
}while(getchar()!='\n');

r->next=NULL;
}

void Disp()//實現順序輸出和逆序輸出
{
N *p=head->next;//用於遍歷單鏈表
int a[MAX];
int i=0,j;

printf("順序輸出:\n");
while(p)
{
printf("%d ",p->data);
a[i]=p->data;
p=p->next;
i++;
}
printf("\n逆序輸出:\n");
for(j=i-1;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
}
void main()
{
Creat();
Disp();
}

希望能幫助你哈

3. 單鏈表就地逆序

遞歸時,head分別用 head head1,head2 ...headn-1, headn來表示(共n+1)個節點
rHead = rev( head->next ); 此句的遞歸一直將參數傳進來的
List * head 遞歸到 headn 然後判斷
else if( !headn->next )
{
return headn;
}
將返回值給rHead,此時rHead指向鏈尾,由於在此次返回,故此次沒有執行最後的else的那部分的語句,返回上一級即是 headn-1 那一級,繼續執行
下面的 headn-1->next->next = headn-1;
headn-1->next = NULL; //此兩句將最後兩個逆序連接,
return rHead; //之後返回rHead比上一層的rHead即是執行
rHead = rev( head->next )賦值,因為遞歸的
口都是在這里的,如果說好理解點也可以將rHead
來編號
同理
在返回rHead後,繼續執行
headn-2->next->next = headn-2;
headn-2->next = NULL;
return rHead;
.....
一直到 head時 即是原鏈表的第一個節點,在對其head->next = NULL,
後,此時以 rHead 所指向的節點為鏈頭的逆序鏈表就形成拉.

由於不能畫圖,故描述得可能還是有點亂吧,不過,一句話,最好的理解就是你將遞歸時,head分別用 head head1,head2 ...headn-1, headn來編號表示就好理解的拉,對於 rHead 最好也標號

4. 如何用c語言實現單鏈表的逆置

扣著的是頭節點(頭子)

車是首節點(首子)

馬是次節點(次子)

牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。

根據步驟寫程序的偽演算法(3步4循環,7張圖片搞定),如下:


第一個循環把馬弄到車前面,

第二個循環把相弄到馬前面

第三個循環把士弄到相前面

........

直到香指向為空後停止循環。

代碼如下:只需要一個首結點pHead,就能把鏈表找到,並倒置。具體代碼如下

p香=pHead->pNext;

p鐵=p香->pNext;

p香->pNext=NULL;

P香=p鐵

while(p香 !=NULL)

{

p鐵=p香->pNext;

p香->pNext=pHead->pNext;

pHead->pNext=p香;

p香=p鐵;

}


對照偽演算法(三步四循環),和上面的代碼是一一對應的:

第一步:香頭指向首子,鐵頭指向次子

第二步:刪掉首子指向次子(鐵頭所指向的那個子)的牙簽

第三步:香頭跟著鐵頭

以下循環條件:(條件:香頭指向不為空)

{

循環1:鐵頭移動到香頭的下一個指向

循環2:香頭的下一個指向首子

循環3:頭子的下一個跟著香頭

循環4:香頭跟著鐵頭

}

自己用道具操作幾遍,然後把流程背會,以後自己根據流程寫代碼即可。

5. 單鏈表的逆序演算法問題

假設有鏈表:h--1--2--3--4 p=h->next;,即p=1--2--3--4 h->next=NULL;即斷開h與p,即h 1--2--3--4 然後while(p) 第一步:q=p,即q=1--2--3--4 第二步:p=p->next;,即p=2--3--4 第三步:q->next=h->next,因為h->next=NULL所以q->next=NULL,即把q斷開為1和2--3--4 第四步:h->next=q;即h->next=1 到此鏈表分成兩部分:h--1和2--3--4 第二次循環: 第一步:q=p,即q=2--3--4 第二步:p=p->next;,即p=3--4 第三步:q->next=h->next,因為h->next=1,所以q->next=1,即把q分成:2--1和3--4 第四步:h->next=q;即h->next=2--1 到此鏈表分成兩部分:h--2--1和3--4 第三次循環: 第一步:q=p,即q=3--4 第二步:p=p->next;,即p=4 第三步:q->next=h->next,因為h->next=2--1,所以q->next=2--1,即把q分成:3--2--1和4 第四步:h->next=q;即h->next=3--2--1 到此鏈表分成兩部分:h--3--2--1和4 第四次循環: 第一步:q=p,即q=4 第二步:p=p->next;,即p=NULL 第三步:q->next=h->next,因為h->next=3--2--1,所以q->next=3--2--1,即把q分成:4--3--2--1和NULL 第四步:h->next=q;即h->next=4--3--2--1 到此鏈表分成兩部分:h--4--3--2--1和NULL p=NULL結束循環.

滿意請採納

6. 求助:單鏈表逆序排列問題,編程高手進!!

給你個圖易理解些(圖做的不好)。

稱已完成逆置的鏈表為鏈表x

L:鏈表x的表頭

L->next:鏈表x的第一個節點

p:待插入到鏈表x的節點

每次將p插入到L與L->next之間即可完成逆置

(原鏈表為空時該演算法也能保證正確,這個你自己看看吧,不解釋了)

7. 單鏈表就地逆置有幾種方法

單鏈表就地逆置的兩種(遞歸與普通循環)
1.用遞歸演算法,對於不帶頭結點的單鏈表(a1,a2,a3,a4,a5,a6)逆置後的結果為(a6,a5,a4,a3,a2,a1)
考慮遞歸演算法,若只有一個結點,則直接返回,若存在兩個結點(a1,a2)則需要做的操作有:a2->next=a1;a1->next=NULL;return a2;
a2即新的頭結點,若有三個結點,則應先將子鏈(a2,a3)先逆置且返回該子鏈的新的頭結點,然後把子鏈(a2,a3)當作一個復合結點a2',
組成新的二元組(a1,a2')然後就可以執行前面相同的操作:a2'->next=a1;a1->next=NULL;return a3';即可,多個以上的結點可同理得到,
Node *Reverse(Node *head)
{
Node *p=head;
if(p==NULL)
return NULL;//若是空鏈表,返回空
Node *q=p->next;
if(q==NULL)
return p;//若只有一個結點,直接返回
else
head=Reverse(q);//記錄子序列的新的頭結點
q->next=p;//當前結點與已經逆置的子序列看成是前後的兩個結點p,q,作相應的逆置操作
p->next=NULL;
return head; //返回新的子序列的頭結點
}
2.用普通演算法循環逆置(頭插法重新建立帶頭結點的新鏈表)
Node *Reverse(Node *head)
{
Node *p=head->next;
if(p)//若鏈表不為空,則逆置,否則,空操作
{
Node *q=p->next;
head->next=NULL;//頭結點分離
while(p)
{
p->next=head->next;//頭插法建立鏈表
head->next=p;
if(q) //操作空指針的時候一定要非常注意,很容易出錯
{
p=q;
q=p->next;
}
else
break;
}
}
return head;
}

8. 如何將單向鏈表逆序

將一條鏈表按逆序輸出
假若頭結點為L,則有;
p=q=L;/*p,q為指向頭結點的兩個指針*/
while(p->next!=NULL)
p=p->next;/*讓p指向鍵表的最後一個要訪問結點*/
while(1)
{
while(q->next!=p)
q=q->next;/*讓q向後找,找到最後一個要列印的結點*/
printf("%d\n",p->data);
p=q;/*p向前移動一個*/
q=L;/*q又指向頭結點*/
if(p=L)/*訪問完了退出*/
break;
}
你參考吧