2013-01-08 16 views
0

反轉單鏈表很容易,下面的代碼工作正常。如何反轉一個循環的單鏈表

void reverse_list (SLINK list) 
{ 
    SLINK tmp = list->next; 
    NODE *cur = NULL; 
    list->next = NULL; 
    for (; NULL != tmp;)  
    { 
      cur = tmp; 
      tmp = tmp->next; 
      cur->next = list->next; 
      list->next = cur; 
    } 
} 

如何反轉循環單鏈表?我的代碼適應這種

SLINK reverse_list (SLINK rear) 
{ 
    NODE *tag = rear->next; 
    SLINK tmp = rear->next; 
    NODE *cur = NULL; 
    rear->next = NULL; 
    for (; NULL != tmp;) 
    { 
     cur = tmp; 
     tmp = tmp->next; 
     cur->next = rear; 
     rear->next = cur; 
    } 
    rear = tag; 
    return rear; 
} 

,但它不工作了,我跑這個功能後認爲,循環鏈表將爲非圓形,實際上,後傾倒,我發現它仍然是一個圓形的列表。 這一定是我犯了一個錯誤的邏輯,請給我看看吧。

回答

0

我不知道你爲什麼說反轉單個鏈表的代碼很好。對我來說它看起來不對。該行 cur-> next = list-> next; 它不會將第二個節點的下一個指針設置爲NULL,因爲您已經在循環外設置了list-> next到NULL?它不應該去第一個節點嗎?

爲什麼你期望一個循環鏈表的逆轉導致一個線性列表?如果您要在一張紙上繪製圓形列表,則反轉只會導致順時針逆時針(或反之亦然)在連接方向上移位。

循環鏈表之間唯一的邏輯變化扭轉和襯墊列表反向將是你會不會接下來的指針設置爲NULL第一個節點的循環鏈表

+0

列表我的測試是一個頭,行CUR->未來=列表 - >下一步;會將第一個節點的下一個指針設置爲NULL –

1

像艾米特的情況下,我不能很理解代碼背後的想法......但從純邏輯的角度來看,如果你已經知道如何打開常規列表,最好的選擇是將你的循環列表中的所有元素複製到一個新的常規列表中用'for',當第一個元素等於當前元素時停止,然後用你的代碼繞過新列表來反轉單個鏈表。

-1

它不是一個循環鏈表但這種方法可以幫助你一點:

//function to reverse the list 
void reverse_list() { 
    struct node *current, *prev, *next; 
    current = head; 
    prev = head; 
    while (prev->next != head) { 
     prev = prev ->next; 
    } 
    while (current->next != head) { 
     next = current->next; 
     current->next = prev; 
     prev = current; 
     current = next; 
    } 
    next = current->next; 
    current->next = prev; 
    prev = current; 
    current = next; 
    head = prev; 
} 
+0

再次閱讀該文章。他明確提到,通告**單**鏈接列表。 – Weaboo