zoukankan      html  css  js  c++  java
  • 链表 2.3

    实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。

    示例

    输入:单向链表a->b->c->d->e中的结点c。

    结果:不返回任何数据,但该链表变为:a->b->d->e。

    分析:因为无法访问待删除结点的前继结点,所以只能通过复制将后续链表整体向前移动一个位置,并删除最后一个多余的结点。显然,当待删除结点为链表的尾结点时(即没有后继),该问题无解。

     1 #include <iostream>
     2 #include <fstream>
     3 #include <assert.h>
     4 
     5 using namespace std;
     6 
     7 struct Node {
     8     Node(): val(0), next(0) {}
     9     Node( int value ): val(value), next(0) {}
    10     int val;
    11     Node *next;
    12 };
    13 
    14 void removeNode( Node *node );
    15 
    16 int main( int argc, char *argv[] ) {
    17     string data_file = "./data.txt";
    18     ifstream ifile( data_file.c_str(), ios::in );
    19     if( !ifile.is_open() ) {
    20         fprintf( stderr, "cannot open file: %s
    ", data_file.c_str() );
    21         return -1;
    22     }
    23     int n = 0, k = -1;
    24     while( ifile >>n >>k ) {
    25         assert( n > 0 && k > 0 && k < n );
    26         Node guard, *node = &guard, *target = 0;
    27         for( int i = 0; i < n; ++i ) {
    28             node->next = new Node();
    29             node = node->next;
    30             ifile >>node->val;
    31             cout <<node->val <<" ";
    32             if( i == k-1 ) { target = node; }
    33         }
    34         cout <<endl;
    35         if( target ) 
    36             cout <<"target to remove: " <<target->val <<endl;
    37         else
    38             cout <<"target to remove: null" <<endl;
    39         removeNode( target );
    40         node = guard.next;
    41         cout <<"result:" <<endl;
    42         while( node ) {
    43             Node *next = node->next;
    44             cout <<node->val <<" ";
    45             delete node;
    46             node = next;
    47         }
    48         cout <<endl <<endl;
    49     }
    50     ifile.close();
    51     return 0;
    52 }
    53 
    54 void removeNode( Node *node ) {
    55     assert( node && node->next );
    56     node->val = node->next->val;
    57     while( node->next->next ) {
    58         node = node->next;
    59         node->val = node->next->val;
    60     }
    61     delete node->next;
    62     node->next = 0;
    63     return;
    64 }

    测试文件

    2 1
    1 3
    
    3 1
    1 2 3
    
    3 2
    1 2 3
    
    7 1
    14 54 96 23 45 12 45
    
    7 2
    14 54 96 23 45 12 45
    
    7 6
    14 54 96 23 45 12 45
  • 相关阅读:
    移动硬盘和u盘的区别
    U盘文件系统格式
    WARN: Establishing SSL connection
    数据库基本操作命令
    PCM EQ DRC 音频处理
    那些年、那些歌、那些事
    编译与链接
    Flash芯片你都认识吗?
    ACM暑假集训第三周小结
    H
  • 原文地址:https://www.cnblogs.com/moderate-fish/p/3980191.html
Copyright © 2011-2022 走看看