1

したがって、スタックオーバーフローには何百もの例があることを知っています。実際、そこからのすべての情報を使用しました-これが私が持っているものです

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行目」がどこにあるのか、実際に値を失うことなくリンクされたリストを逆にするために何を変更すればよいのかということです。

4

1 に答える 1

3

あなたの反転サブルーチンはほぼ正しいです。ただし、使用している条件が原因で、最後のエントリが失われます (つまり、最後の反転リストに追加されます)。次の 2 つのオプションがあります。

  1. while ($list->{next})を to に変更しwhile ($list)て、コードをより慣用的なものにします。

  2. ループ$list->{next}= $previous;の最後にaを追加して、最後に残ったノードを反転リストに追加します。while(2 つの要素のリストを考えて、コードの動作を確認してください)。

于 2012-06-10T01:16:48.990 に答える