PHP單鏈表的基本操作

前提

對(duì)于大多數(shù)的大一,大二的童鞋們來說咐蚯,可能最操蛋的就是數(shù)據(jù)結(jié)構(gòu)這個(gè)課了童漩,什么鏈表,堆棧春锋,隊(duì)列矫膨,圖,簡(jiǎn)直噩夢(mèng)期奔!對(duì)我也是侧馅,我也是在大三后實(shí)習(xí)后發(fā)現(xiàn)這個(gè)真的是個(gè)硬技能,

鏈表的實(shí)現(xiàn)

數(shù)據(jù)結(jié)構(gòu)第一個(gè)就是鏈表了呐萌,鏈表分為兩種有直接的數(shù)組形式的順序鏈馁痴,這里不討論,什么array_push(),array_pop()肺孤,函數(shù)基本能滿足日常的需求罗晕,但報(bào)告老板,我就是想裝個(gè)X

上代碼吧

<?php

/**
 *@author:gongbangwei(18829212319@163.com)
 *@version:1.0
 *@date:2016-05-22
 *單鏈表的基本操作
 *1.初始化單鏈表 __construct()
 *2.清空單鏈表 clearSLL()
 *3.返回單鏈表長(zhǎng)度 getLength()
 *4.判斷單鏈表是否為空 getIsEmpty()
 *5.頭插入法建表 getHeadCreateSLL()
 *6.尾插入法建表 getTailCreateSLL()
 *7.返回第$i個(gè)元素 getElemForPos()
 *8.查找單鏈表中是否存在某個(gè)值的元素 getElemIsExist()
 *9.單鏈表的插入操作 getInsertElem()
 *10.遍歷單鏈表中的所有元素 getAllElem()
 *11.刪除單鏈中第$i個(gè)元素 getDeleteElem()
 *12.刪除單鏈表所有重復(fù)的值 getElemUnique()
 **/
 header("content-type:text/html;charset=UTF-8");
 class LNode{
    public $mElem;
    public $mNext;
    public function __construct(){
        $this->mElem=null;
        $this->mNext=null;
    }
}
class SingleLinkedList{
     //頭結(jié)點(diǎn)數(shù)據(jù)
    public $mElem;
    //下一結(jié)點(diǎn)指針
    public $mNext;
    //單鏈表長(zhǎng)度
    public static $mLength=0;
    public function __construct(){
        $this->mElem=null;
        $this->mNext=null;
    }
    //返回單鏈表長(zhǎng)度
      public static function getLength(){
          return self::$mLength;
    }
      public function getIsEmpty(){
        if(self::$mLength==0 && $this->mNext==null){
            return true;
        }
        else{
            return false;
        }
      }
      public function clearSLL(){
            if(self::$mLength>0){
                while($this->mNext!=null){
                        $q=$this->mNext->mNext;
                        $this->mNext=null;
                        unset($this->mNext);
                        $this->mNext=$q;
            }
           self::$mLength=0;
        }
    }
    public function getHeadCreateSLL($sarr){
        $this->clearSLL();

        if(is_array($sarr) and count($sarr)>0){
            foreach ($sarr as $key => $value) {
                $p= new LNode;
                $p->mElem=$value;
                $p->mNext=$this->mNext;
                $this->mNext=$p;
                self::$mLength++;
            }
        }
        else{
            return false;
        }
        return true;
    }
     public function getTailCreateSLL($sarr){
        $this->clearSLL();

        if(is_array($sarr) and count($sarr)>0){
                $q=$this;
                foreach($sarr as $value){
                        $p=new LNode;
                        $p->mElem=$value;
                        $p->mNext=$q->mNext;
                        $q->mNext=$p;
                        $q=$p;
                        self::$mLength++;
            }
        }
        else{
                return false;
        }
    }
     public function getElemForPos($i){
        if(is_numeric($i) && $i<self::$mLength && $i>0){
            $p=$this->mNext;
            for ($j=1; $j < $i ; $j++) { 
                $q=$p->mNext;
                $p=$q;
            }
            return $p->mElem;
        }
        else{
            return null;
        }
     }
      public function getElemIsExist($value){
        if($value){
            $p=$this;
            while($p->mNext!=null and $p->mElem!=value){
                $q=$p->mNext;
                $p=$q;
            }
            if($p->mElem==value){
                return true;
            }
            else{
                return false;
            }
        }
      }
      public function getElemPosition($value){
        if($value){
            $p=$this;
            $pos=0;
            while($p->mNext!=null and $p->mElem!=$value){
                $q=$p->mNext;
                $p=$q;
                $pos++;
            }
            if($p->mElem==$value){
                return $pos;
            }
            else{
                return -1;
            }
        }
      }
        /*單鏈表的插入操作
     *
     *@param int $i 插入元素的位序赠堵,即在什么位置插入新的元素,從1開始
     *@param mixed $e 插入的新的元素值
     *@return boolean 插入成功返回true小渊,失敗返回false
     */
        public function getInsertElem($i,$e){
            if($i<self::$mLength){
                $j=1;
                $p=$this;
            }
            else{
                return false;
            }
            while($p->mNext!=null and $j<$i){
                $q=$p->mNext;
                $p=$q;
                $j++;
            }
            $q=new LNode;
            $q->mElem=$e;
            $q->mNext=$p->mNext;
            $p->mNext=$q;
            self::$mLength++;
            return true;
        }
      /**
     *刪除單鏈中第$i個(gè)元素
     *@param int $i 元素位序
     *@return boolean 刪除成功返回true,失敗返回false
     */
    public function getDeleteElem($i){
        if($i>self::$mLength || $i<1){
                return false;
            }
            else{
                $p=$this;
                $j=1;
                while($j<$i){
                    $p=$p->mNext;
                    $j++;
                }
                $q=$p->mNext;
                $p->mNext=$q->mNext;
                unset($q);
                self::$mLength--;
                return true;
            }
    }
     public function getAllElem(){
        $all=array();
        if(!$this->getIsEmpty()){
            $p=$this->mNext;
            while($p->mNext){
                $all[]=$p->mElem;
                $p=$p->mNext;
            }
            if($p->mElem)
                $all[]=$p->mElem;
            return $all;
        }
     }
     public function getElemUnique(){
         if(!$this->getIsEmpty()){
                $p=$this;
                while($p->mNext!=null){
                        $q=$p->mNext;
                        $ptr=$p;
                        while($q->mNext!=null){
                                if(strcmp($p->mElem,$q->mElem)===0){
                                    $ptr->mNext=$q->mNext;
                                    $q->mNext=null;
                                    unset($q->mNext);
                                    $q=$ptr->mNext;
                                    self::$mLength--;
                                }
                                else{
                                    $ptr=$q;
                                    $q=$q->mNext;
                                }
                    }
                    //處理最后一個(gè)元素
                if(strcmp($p->mElem,$q->mElem)===0){
                                $ptr->mNext=null;
                                self::$mLength--;
                        }
                        $p=$p->mNext;
                }//end of while
            }   
    }
}

///////////////test//////////
$node=new SingleLinkedList;
$arr=array('gbw','michael','php','js');
//$node->getHeadCreateSLL($arr);
//print_r($node->getAllElem());
$node->getTailCreateSLL($arr);
echo $node->getElemForPos(2);
$pos=$node->getElemPosition('gbw');
echo $pos;
$node->getDeleteElem($pos);
$node->getInsertElem(1,'gbw2');
print_r($node->getAllElem());

希望對(duì)大家的php程序設(shè)計(jì)有所幫助!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茫叭,一起剝皮案震驚了整個(gè)濱河市酬屉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揍愁,老刑警劉巖呐萨,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吗垮,居然都是意外死亡垛吗,警方通過查閱死者的電腦和手機(jī)凹髓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門烁登,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事饵沧∠锹纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵狼牺,是天一觀的道長(zhǎng)羡儿。 經(jīng)常有香客問我,道長(zhǎng)是钥,這世上最難降的妖魔是什么掠归? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮悄泥,結(jié)果婚禮上虏冻,老公的妹妹穿的比我還像新娘。我一直安慰自己弹囚,他們只是感情好厨相,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸥鹉,像睡著了一般蛮穿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毁渗,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天践磅,我揣著相機(jī)與錄音,去河邊找鬼灸异。 笑死音诈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绎狭。 我是一名探鬼主播细溅,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼儡嘶!你這毒婦竟也來了喇聊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蹦狂,失蹤者是張志新(化名)和其女友劉穎誓篱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凯楔,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窜骄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摆屯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻遏。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出准验,到底是詐尸還是另有隱情赎线,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布糊饱,位于F島的核電站垂寥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏另锋。R本人自食惡果不足惜滞项,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夭坪。 院中可真熱鬧蓖扑,春花似錦、人聲如沸台舱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竞惋。三九已至柜去,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拆宛,已是汗流浹背嗓奢。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浑厚,地道東北人股耽。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钳幅,于是被迫代替她去往敵國(guó)和親物蝙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容