2012-06-10 119 views
1

所以我知道有上百棟的堆棧溢出,而事實上我已經使用從那裏所有的信息 - 所以這是我所在Perl反向鏈接列表

use strict; 
use warnings; 
use Data::Dumper; 

my $head= undef; 
my $tail=\$head; 

open FILE, "<datastored.txt" or die $!; 

while (<FILE>){ 
    my $node = { 
       "data" => $_ , 
       "next" => undef 
      }; 
    $$tail=$node; 
    $tail = \$node->{"next"}; 
}; 
print Dumper $head; #before reversing 
$head = reverse_list($head); 
print Dumper $head; #after reversing 
sub reverse_list{ 
    my ($list) [email protected]_[0]; 
    my $previous = undef; 
    while ($list->{next}){ 
     $forward = $list->{next}; 
     $list->{next}= $previous; 
     $previous = $list; 
     $list=$forward; 
    }; 
    return $previous; 
}; 

,這是輸出我得到

#this is the output before reversing (normal linked list) 
$VAR1 = { 
      'next' => { 
         'next' => { 
            'next' => { 
               'next' => undef, 
               'data' => 'line 4 
' 
              }, 
            'data' => 'line 3 
' 
           }, 
         'data' => 'line 2 
' 
        }, 
      'data' => 'line 1 
' 
     }; 
#this is the linked list after reversing (WITHOUT THE LAST DATA VARIABLE - "line 4") 
$VAR1 = { 
      'next' => { 
         'next' => { 
            'next' => undef, 
            'data' => 'line 1 
' 
           }, 
         'data' => 'line 2 
' 
        }, 
      'data' => 'line 3 
' 
     }; 

注 - 文件datastored.txt的內容僅僅是

line 1 
line 2 
line 3 
line 4 

所以我的問題是數據「第4行」已經消失了,應該怎樣改變才能真正反轉鏈接列表而不會丟失任何值。

+1

你的代碼不能編譯,因爲你在給'$ forward'賦值前忘了'my'。不過,除了@ dirkgently的回答外,我還有一個額外的建議。你應該安裝CPAN'Data :: Dump'模塊,並將'print Dumper'的兩個實例更改爲'dd'(更改'use Data :: Dump'後)。輸出比Data :: Dumper'更容易讀取。 – tchrist

+0

那麼你可以在文件頂部刪除'use strict;'和'warnings;'。也感謝您的建議 - 數據::轉儲,我一定會嘗試一下 – Amey

+0

我看你還有'我的$尾= \ $頭;錯誤? – ikegami

回答

3

您的反轉子程序幾乎是正確的。但是,由於您正在使用的條件,它會錯過最後一個條目(即將其添加到最終的反轉列表中)。你有兩個選擇:

  1. 更改while ($list->{next})while ($list)和使代碼更地道。

  2. while循環結束後添加$list->{next}= $previous;以將最後一個剩餘節點添加到您的反轉列表中。 (想想兩個元素的列表,看看你的代碼做什麼)。

+0

哇!!!!我更喜歡選項編號1,它工作得很好!我有一個選擇,試圖通過理解爲什麼它失敗或要求堆棧溢出來解決它。我選擇了前5個小時,但幸好我放下我的自我並問了問題。試圖弄清楚爲什麼它沒有工作,精神枯竭。謝謝。祝你有美好的一天! :) – Amey

+0

@seleniumnewbie:這是一個不錯的選擇。使用慣用方法使維護更容易。只要你考慮了一段時間並且不能提出答案,問問你就太好了。 – dirkgently