2013-08-01 113 views
1

我在學習鏈表。我有一點麻煩。我學到了一些基本概念。如閱讀在列表中的數字如下所示:我的問題是:單向鏈表反向

  1. 任何人都可以給我一些提示,如何改善此代碼?我知道這很雜亂。
  2. 如果我要顛倒這個鏈表(保持地址和內容相同),但操縱指針。

我該怎麼做?我不想完整的解決方案,只是一些提示。如果任何人都可以繪製任何關於如何反轉鏈接列表的圖表,我們將不勝感激。

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

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

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

    struct node *pNew, *pHead, *pCurr; 
    int i, dataEntered, numberOfNodes; 
    printf("Please enter the amount of nodes: "); 
    scanf("%d", &numberOfNodes); 

    for (i = 0; i < numberOfNodes; i++){ 
     printf("Enter data for node %d : ", numberOfNodes-i); 
     scanf("%d", &dataEntered);  
     pNew = malloc (sizeof(struct node)); 
     pNew -> data = dataEntered; 
     pNew -> next = pHead; 
     pHead = pNew; 
    } 

    pCurr = pHead; 
    for (i = 0; i < numberOfNodes; i++){ 
     printf("Node %d has a data value of: %d\n", i, pCurr->data); 
     pCurr = pCurr->next; 

    } 


    return 0; 
} 
+0

沒有關於[反向鏈表]的現有問題(http ://stackoverflow.com/search?q =反向+鏈接+列表)有幫助嗎? – AShelly

+0

你需要初始化pHead。 ''struct node * pNew,* pHead = NULL,* pCurr;' – BLUEPIXY

+0

學習這些東西的訣竅是**將它分解成最小的可能步驟。**你知道如何(1)製作一個空列表, 2)測試一個列表是否爲空,(3)從非空列表的末尾刪除一個元素,以及(4)將一個元素插入到非空列表的開頭?如果你可以做這四件事情,那麼你可以反轉一個鏈表。你看到了嗎? –

回答

0

讓我給你一點代碼..

struct node *nex, *curr, *pre; 
curr = phead; 
pre = 0; 
while(curr) 
{ 
     nex = curr->next; 
     curr->next = pre; 
     pre = curr; 
     curr = nex; 
} 
phead = pre; 
+1

這不是C,對吧? * – urzeit

+0

對不起,我是一個初學者編碼器Hitesh,所以我不太清楚'Node '是指 –

+0

這對於C或C++都是一樣的。我只是寫邏輯部分.. –

0

對於鏈表的逆轉,這是很簡單的,只是做一個新的鏈表,在那裏你把新節點(總是從第二個LList的頭部遍歷,直到當前節點的下一個爲空,然後將pNew放到當前 - >下一個)