在perl中反转链表

时间:2012-06-10 01:06:26

标签: perl linked-list

所以我知道堆栈溢出有一百个例子,事实上我已经使用了那里的所有信息 - 所以这就是我所拥有的

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) =@_[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 个答案:

答案 0 :(得分:3)

你的逆转子程序几乎是正确的。但是,由于您使用的条件,它错过了最后一个条目(即将其添加到最终的反向列表中)。您有两种选择:

  1. while ($list->{next})更改为while ($list)并使代码更加惯用。

  2. $list->{next}= $previous;循环结束后添加while,将最后剩余的节点添加回您的反向列表。 (想一想两个元素的列表,看看你的代码是做什么的)。