導航:首頁 > 源碼編譯 > c單鏈表演算法逆置

c單鏈表演算法逆置

發布時間:2024-10-19 06:22:39

A. 什麼叫單鏈表就地逆置

1、單鏈表就地逆置是一種演算法

2、如果是順序存儲的話,我們很容易想到解題思路,利用1個輔助變數讓第1個元素與第n個元素交換,然後再利用這個輔助變數讓第2個元素與第n-1個元素交換,...最後利用這個輔助變數讓第n/2個元素與第n+1-n/2個元素交換。

3、如果不要求「就地」的話,可以創建一個n個元素輔助數組,一次訪問單鏈表中的每個元素,並存儲到該數組中,然後再依次訪問單鏈表中的每一個元素,同時從該數組的末尾開始為單鏈表中的元素賦值,直到數組第1個元素的值賦值給單鏈表最後一個元素。

4、如果單鏈表為空或單鏈表中只有頭結點,那麼單鏈表不需要逆置,如果單鏈表中只有一個元素,逆置之後它的位置還是不會改變,所以可以不逆置。當單鏈表中有2個或兩個以上的元素時,從第1個元素斷開,令它的next為空,依次訪問第2個元素到第n個元素,當訪問到其中的任意一個元素時,將它插入到頭結點之後,也就是把它插入到第1個位置,這樣原始的第1個元素就會被後面的n-1個元素插入到它的前面,原始的第2個元素就會被後面的n-2個元素插入到它的前面,...直到原始的第n個元素插入到第1個位置。這樣就實現了帶頭結點的單鏈表的就地逆置。

B. 如何用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:香頭跟著鐵頭

}

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

C. 用c語言實現單鏈表的逆置,能將此程序詳細的解釋一下嗎

演算法的核心就是reverse函數,其它的都是輔助建立鏈表和輸出鏈表的。
從數據結構的定義來看這是一個帶頭節點的鏈表。要弄的十分明白你要耐心點畫圖看看。我簡單的說下思路:
【head是指向頭結點的】
p=head; //p最開始指向頭結點
s=p->next; //s最開始指向第一個節點
while(s->next!=NULL)//只要沒有到最後一個元素就繼續。最後一個元素的next肯定為NULL
{ //進入核心了樓主
t=s->next; //用t指向s後面的那個元素
s->next=p; //把s指向她前面那個,這個時候就實現了逆向了。而且是就地逆向。元素都沒有動的
p=s; //然後p向後移動s
s=t; //s向後移動到p
這樣到下一輪的時候又可以講下下個再指向剛才那個下一個。一次內推
}
s->next=p; //當最後一個的時候,還是要指向她的前一個。
head->next->next=NULL;//頭指針的下一個是指向原來的第一個。逆向後肯定是最後的那個了。所以最後的一個的next=NULL就明了了。
head->next=s;//s是逆序前的最後一個,逆序後是第一個,所以用頭指向他

畫個圖好好體會下,樓主!

D. 單鏈表的逆置演算法

幫你寫好了,你看下

#include <stdio.h>
#include <stdlib.h>

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

//創建鏈表
Node *CreatList(void)
{
int i;
Node *head, *p, *q;

head = NULL;
printf("請輸入您要輸入的數據:\n");
scanf("%d", &i);
while(i != 0)
{
p = (Node *)malloc(sizeof(Node));
p->data = i;
if(head == NULL)
q = head = p;
else
q->next = p;
q = p;
scanf("%d", &i);
}
p->next = NULL;
return head;
}

//鏈表的逆置
Node *ReverseList(Node *head)
{
Node *p, *q, *r;

p = head;
q=r=NULL;

while(p)
{
q = p->next;
p->next = r;
r = p;
p = q;
}
return r;
}

//輸出鏈表
void PrintList(Node *head)
{
Node *p;

p = head;
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
}

int main(void)
{
Node *head;

head = CreatList();
printf("鏈表逆置前的數據:\n");
PrintList(head);

head = ReverseList(head);
printf("鏈表逆置後的數據:\n");
PrintList(head);

return 0;
}

請輸入您要輸入的數據:
1 2 3 4 5 6 0
鏈表逆置前的數據:
1
2
3
4
5
6
鏈表逆置後的數據:
6
5
4
3
2
1

E. C語言實現線性表的逆置問題,順序和單鏈表。在線等高手

逆置有兩種方法,第一是把所有節點反過來。還有一種就是改變節點中的值。
第一種情況,其實可以考慮用頭插法,來實現逆置。
下面的演算法是基於頭插法的思想,逆置鏈表的,僅供參考。
LinkList anti_linklist(LinkList demo)
{
LInkList *p,*q;//work pointer
LinkList head;
head=new LinkList();
head->next=null;//init head pointer
p=demo->head->next;//make p points to the first node
if(p==null)
return null;//the linklist is null
while(p!=null)
{
q=p;
q->next=head->next;
head->next=q;
p=p->next;
}
}

這個是我回答之前的一個問題的答案。供你參考。

閱讀全文

與c單鏈表演算法逆置相關的資料

熱點內容
光遇安卓怎麼平地滑行 瀏覽:157
常州php培訓 瀏覽:447
油氣田開發pdf 瀏覽:930
家有帶寬和伺服器帶寬有什麼區別 瀏覽:902
windows下編譯c語言開發工具 瀏覽:224
守望之海伺服器地址在那 瀏覽:903
程序員畢業後薪資 瀏覽:199
app買菜退款麻煩在哪裡舉報 瀏覽:768
redis一致性hashphp 瀏覽:649
如何導入瀏覽器文件夾 瀏覽:551
python爬蟲游戲 瀏覽:234
androidlogcat顏色 瀏覽:674
不用錢解壓軟體 瀏覽:552
安卓手機用什麼軟體開發 瀏覽:249
我的世界伺服器怎麼設置領地語 瀏覽:109
蘋果導安卓照片用什麼軟體 瀏覽:362
如何在蘋果電腦上綁定qq郵箱伺服器地址 瀏覽:864
我的世界伺服器如何防止小號 瀏覽:401
md5加解密演算法 瀏覽:388
如何用伺服器開代理 瀏覽:596