zoukankan      html  css  js  c++  java
  • 用PHP实现的单链表

    单链表顾名思义就是一个链式数据结构,它有一个表头,并且除了最后一个节点外,所有节点都有其后继节点。如下图。

    首先,我们写出链表节点的类。单链表中的每一个节点,都保存其数据域和后驱指针

    [php] view plain copy
     
    1. //链表节点   
    2. class node {   
    3.     public $id; //节点id   
    4.     public $name; //节点名称   
    5.     public $next; //下一节点   
    6.      
    7.     public function __construct($id, $name) {   
    8.         $this->id = $id;   
    9.         $this->name = $name;   
    10.         $this->next = null;   
    11.     }   
    12. }  

    链表中还有两个特别重要的方法,插入和删除。插入需要找到插入的位置,把前一个元素的next指针指向被插入的节点,并将被插入节点的next指针指向后一个节点,如下图左侧所示。而删除则是把前一个节点的next指针指向后一个节点,并返回被删除元素的数据内容,如下图右侧所示。
     

    [php] view plain copy
     
      1. //单链表   
      2. class singelLinkList {   
      3.     private $header; //链表头节点   
      4.      
      5.     //构造方法   
      6.     public function __construct($id = null, $name = null) {   
      7.         $this->header = new node ( $id, $name, null );   
      8.     }   
      9.   
      10.     //获取链表长度   
      11.     public function getLinkLength() {   
      12.         $i = 0;   
      13.         $current = $this->header;   
      14.         while ( $current->next != null ) {   
      15.             $i ++;   
      16.             $current = $current->next;   
      17.         }   
      18.         return $i;   
      19.     }   
      20.   
      21.     //添加节点数据   
      22.     public function addLink($node) {   
      23.         $current = $this->header;   
      24.         while ( $current->next != null ) {   
      25.             if ($current->next->id > $node->id) {   
      26.                 break;   
      27.             }   
      28.             $current = $current->next;   
      29.         }   
      30.         $node->next = $current->next;   
      31.         $current->next = $node;   
      32.     }   
      33.   
      34.     //删除链表节点   
      35.     public function delLink($id) {   
      36.         $current = $this->header;   
      37.         $flag = false;   
      38.         while ( $current->next != null ) {   
      39.             if ($current->next->id == $id) {   
      40.                 $flag = true;   
      41.                 break;   
      42.             }   
      43.             $current = $current->next;   
      44.         }   
      45.         if ($flag) {   
      46.             $current->next = $current->next->next;   
      47.         } else {   
      48.             echo "未找到id=" . $id . "的节点!<br>";   
      49.         }   
      50.     }  
      51.   
      52.     //判断连表是否为空  
      53.     public function isEmpty(){  
      54.             return $this->header == null;  
      55.     }  
      56.   
      57.     //清空链表  
      58.     public function clear(){  
      59.             $this->header = null;  
      60.     }   
      61.   
      62.     //获取链表   
      63.     public function getLinkList() {   
      64.         $current = $this->header;   
      65.         if ($current->next == null) {   
      66.             echo ("链表为空!");   
      67.             return;   
      68.         }   
      69.         while ( $current->next != null ) {   
      70.             echo 'id:' . $current->next->id . '   name:' . $current->next->name . "<br>";   
      71.             if ($current->next->next == null) {   
      72.                 break;   
      73.             }   
      74.             $current = $current->next;   
      75.         }   
      76.     }   
      77.   
      78.     //获取节点名字   
      79.     public function getLinkNameById($id) {   
      80.         $current = $this->header;   
      81.         if ($current->next == null) {   
      82.             echo "链表为空!";   
      83.             return;   
      84.         }   
      85.         while ( $current->next != null ) {   
      86.             if ($current->id == $id) {   
      87.                 break;   
      88.             }   
      89.             $current = $current->next;   
      90.         }   
      91.         return $current->name;   
      92.     }   
      93.   
      94.     //更新节点名称   
      95.     public function updateLink($id, $name) {   
      96.         $current = $this->header;   
      97.         if ($current->next == null) {   
      98.             echo "链表为空!";   
      99.             return;   
      100.         }   
      101.         while ( $current->next != null ) {   
      102.             if ($current->id == $id) {   
      103.                 break;   
      104.             }   
      105.             $current = $current->next;   
      106.         }   
      107.         return $current->name = $name;   
      108.     }   
      109. }  
      110. $lists = new singelLinkList ();   
      111. $lists->addLink ( new node ( 5, 'eeeeee' ) );   
      112. $lists->addLink ( new node ( 1, 'aaaaaa' ) );   
      113. $lists->addLink ( new node ( 6, 'ffffff' ) );   
      114. $lists->addLink ( new node ( 4, 'dddddd' ) );   
      115. $lists->addLink ( new node ( 3, 'cccccc' ) );   
      116. $lists->addLink ( new node ( 2, 'bbbbbb' ) );   
      117. $lists->getLinkList ();   
      118. echo "<br>-----------删除节点--------------<br>";   
      119. $lists->delLink ( 5 );   
      120. $lists->getLinkList ();  
      121. echo "<br>-----------更新节点名称--------------<br>";   
      122. $lists->updateLink ( 3, "222222" );   
      123. $lists->getLinkList ();  
      124. echo "<br>-----------获取节点名称--------------<br>";   
      125. echo $lists->getLinkNameById ( 5 );  
      126. echo "<br>-----------获取链表长度--------------<br>";   
      127. echo $lists->getLinkLength ();   
  • 相关阅读:
    Java多线程编程初识— —2
    Java多线程编程初识
    Java XML解析技术
    Java读取Properties文件的六种方法
    Java对象的序列化与反序列化
    文言写作
    阅读理解主题综合训练
    记叙文阅读的六大题型详解(全部转换成法事情人"法事情人")
    读书类、美景类作文
    开头技法
  • 原文地址:https://www.cnblogs.com/zzc666/p/8035962.html
Copyright © 2011-2022 走看看