晓夏

北漂的女孩

Good Luck To You!

php 单链表学习

浏览量:401


  单链表,节点只有一个指针域的链表。节点包括数据域和指针域。

  因此用面向对象的思维,节点类的属性就有两个:一个data(表示存储的数据),一个指针next(链表中指向下一个节点)。

  链表一个很重要的特性,就是这个头节点$head。它绝对不能少,每次遍历都要从它开始,并且不能移动头节点,应该用一个变量去代替他移动。脑袋里要有链表的结构。这是关键。

  来一段代码:

  

<?php
//单链表   
class singelLinkList {   
    private $header; //链表头节点   
     
    //构造方法   
    public function __construct($id = null, $name = null) {   
        $this->header = new node ( $id, $name, null );   
    }   
  
    //获取链表长度   
    public function getLinkLength() {   
        $i = 0;   
        $current = $this->header;   
        while ( $current->next != null ) {   
            $i ++;   
            $current = $current->next;   
        }   
        return $i;   
    }   
  
    //添加节点数据   
    public function addLink($node) {   
        $current = $this->header;   
        while ( $current->next != null ) {   
            if ($current->next->id > $node->id) {   
                break;   
            }   
            $current = $current->next;   
        }   
        $node->next = $current->next;   
        $current->next = $node;   
    }   
  
    //删除链表节点   
    public function delLink($id) {   
        $current = $this->header;   
        $flag = false;   
        while ( $current->next != null ) {   
            if ($current->next->id == $id) {   
                $flag = true;   
                break;   
            }   
            $current = $current->next;   
        }   
        if ($flag) {   
            $current->next = $current->next->next;   
        } else {   
            echo "未找到id=" . $id . "的节点!<br>";   
        }   
    }  
  
    //判断连表是否为空  
    public function isEmpty(){  
            return $this->header == null;  
    }  
  
    //清空链表  
    public function clear(){  
            $this->header = null;  
    }   
  
    //获取链表   
    public function getLinkList() {   
        $current = $this->header;   
        if ($current->next == null) {   
            echo ("链表为空!");   
            return;   
        }   
        while ( $current->next != null ) {   
            echo 'id:' . $current->next->id . '   name:' . $current->next->name . "<br>";   
            if ($current->next->next == null) {   
                break;   
            }   
            $current = $current->next;   
        }   
    }   
  
    //获取节点名字   
    public function getLinkNameById($id) {   
        $current = $this->header;   
        if ($current->next == null) {   
            echo "链表为空!";   
            return;   
        }   
        while ( $current->next != null ) {   
            if ($current->id == $id) {   
                break;   
            }   
            $current = $current->next;   
        }   
        return $current->name;   
    }   
  
    //更新节点名称   
    public function updateLink($id, $name) {   
        $current = $this->header;   
        if ($current->next == null) {   
            echo "链表为空!";   
            return;   
        }   
        while ( $current->next != null ) {   
            if ($current->id == $id) {   
                break;   
            }   
            $current = $current->next;   
        }   
        return $current->name = $name;   
    }   
}  
$lists = new singelLinkList ();   
$lists->addLink ( new node ( 5, 'eeeeee' ) );   
$lists->addLink ( new node ( 1, 'aaaaaa' ) );   
$lists->addLink ( new node ( 6, 'ffffff' ) );   
$lists->addLink ( new node ( 4, 'dddddd' ) );   
$lists->addLink ( new node ( 3, 'cccccc' ) );   
$lists->addLink ( new node ( 2, 'bbbbbb' ) );   
$lists->getLinkList ();   
echo "<br>-----------删除节点--------------<br>";   
$lists->delLink ( 5 );   
$lists->getLinkList ();  
echo "<br>-----------更新节点名称--------------<br>";   
$lists->updateLink ( 3, "222222" );   
$lists->getLinkList ();  
echo "<br>-----------获取节点名称--------------<br>";   
echo $lists->getLinkNameById ( 5 );  
echo "<br>-----------获取链表长度--------------<br>";   
echo $lists->getLinkLength ();

神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。