Home Backend Development PHP Tutorial A brief discussion on how to implement and process linked lists in PHP

A brief discussion on how to implement and process linked lists in PHP

Mar 02, 2021 pm 06:02 PM
php linked list

This article will introduce to you how to implement and process linked lists in PHP. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

A brief discussion on how to implement and process linked lists in PHP

[Recommended learning: "PHP Video Tutorial"]

Linked List

A linked list is a non-continuous and non-sequential storage structure on a physical storage unit. The logical order of data elements is realized through the link order of pointers in the linked list. A linked list consists of a series of nodes (each element in the linked list is called a node), and nodes can be dynamically generated at runtime.

Forms: single linked list, double linked list, skip list (the redis collection data structure is realized by skip list, time complexity O (log N))

Learn about skip list: https://lotabout .me/2018/skip-list/

php implements the add, delete, modify and query operations on the linked list

Define node class:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?php class Node

{

    public $val;

    public $next;

 

 

 

    public function __construct( $val = null, $next = null )

    {

        $this->val  = $val;

        $this->next = $next;

    }

 

 

}

Copy after login

Linked list class:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

<?php /**链表

 * Class Linklist

 * @package app\models

 */

class Linklist

{

    public $head;           //头节点(默认一个虚拟头节点)

    public $size;           //长度

 

    public function __construct()

    {

        $this->head = new Node();

        $this->size  = 0;

    }

 

    //头插法

    public function addFirst( $value ){

//        $node = new Node($value);

//        $node->next = $this->head;

//        $this->head = $node;

 

        //简化

//        $this->head = new Node( $value, $this->head );

//        $this->size++;

 

        $this->add(0,$value);

    }

 

    /**指定索引位置插入

     * @param $index

     * @param $value

     * @throws Exception

     */

    public function add( $index$value ){

 

        if$index $this->size )

            throw new Exception('超过链表范围');

 

//        if( $index==0 ){

//            $this->addFirst($value);

//        }else{

            $prev $this->head;

            for($i=0;$inext;

            }

 

//            $node = new Node($value);

//            $node->next = $prev->next;

//            $prev->next = $node;

 

            $prev->next = new Node($value,$prev->next);

//        }

 

        $this->size++;

    }

 

    /**尾插法

     * @param $value

     */

    public function addLast( $value ){

 

        $this->add($this->size,$value);

 

    }

 

 

    /***

     * 编辑

     * @param $index

     * @param $value

     * @throws Exception

     */

    public function edit( $index$value ){

        if$index $this->size-1 )

            throw new Exception('超过链表范围');

 

        $prev $this->head->next;

        for($i=0;$ival $value;

            $prev $prev->next;

        }

 

    }

 

    /**

     * 查询

     * @param $index

     * @return null

     * @throws Exception

     */

    public function select($index){

        if$index $this->size-1 )

            throw new Exception('超过链表范围');

 

        $prev $this->head->next;

        for($i=0;$inext;

        }

    }

 

 

    /**删除

     * @param $index

     * @throws Exceptionr

     */

    public function delete$index ){

        if$index $this->size-1 )

            throw new Exception('超过链表范围');

 

        $prev $this->head;

        for($i=0;$inext $prev->next->next;

            $prev $prev->next;

        }

        $this->size--;

    }

 

    /**检索值是否存在

     * @param $value

     * @return bool

     */

    public function iscontain( $value ){

        $prev $this->head->next;

        while$prev ){

 

            if$prev->val==$value ){

                return true;

            }

            $prev $prev->next;

        }

 

        return false;

    }

 

    /**转换为字符串

     * @return string

     */

    public function tostring(){

 

        $prev $this->head->next;

 

        $r = [];

        while$prev ){

            $r[] = $prev->val;

            $prev $prev->next;

        }

        return implode('->',$r);

 

    }

     

     /**

      * 删除指定的节点值

      * @param $value

      */

      public function removeFileds( $value ){

           $prev $this->head;

           while$prev->next ){

               if$prev->val == $value ){

                   $prev->val = $prev->next->val;

                   $prev->next = $prev->next->next;

               }else{

                   $prev $prev->next;

               }

           }

      }

       

       /**

        * 通过递归方式删除指定的节点值

        * @param $value

        */

       public function removeFiledsByRecursion( $value ){

           $this->head = $this->removeByRecursion( $this->head ,$value);

           return $this->head;

       }

    

        public function removeByRecursion( $node $value$level=0 ){

               if$node->next == null ){

                   $this->showDeeep($level,$node->val);

                   return $node->val == $value $node->next:$node;

               }

        

               $this->showDeeep($level,$node->val);

               $node->next = $this->removeByRecursion( $node->next,$value,++$level );

               $this->showDeeep($level,$node->val);

               return $node->val == $value $node->next:$node;

           }

        

        /**

        * 显示深度

        * 帮助理解递归执行过程,回调函数执行层序遵循系统栈 

        * @param int $level 深度层级

        * @param $val

        * @return bool

        */

        public function showDeeep( $level=1,$val ){

             if$level<p>The calling operation is as follows: </p><pre class="brush:php;toolbar:false"><?php $node = new Linklist();

$node->addFirst(1);

$node->add(1,7);

$node->add(2,10);

$node->edit(1,8);

var_dump($node->select(1)) ;

$node->delete(1);

$node->addLast(99);

var_dump($node->iscontain(2));

var_export($node);

var_export($node->tostring());

Copy after login

Analyze the time complexity of the linked list operation:

1

2

3

4

5

6

7

增: O(n)  只对链表头操作:O(1)

 

删: O(n)  只对链表头操作:O(1)

 

改:O(n)

 

查:O(n)   只对链表头操作:O(1)

Copy after login

Use the linked list to implement the stack

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<?php /**

 * 链表实现栈

 * Class LinklistStack

 * @package app\models

 */

class LinklistStack extends Linklist

{

    /**

     * @param $value

     */

    public function push( $value ){

        $this->addFirst($value);

    }

 

    /**

     * @return mixed

     */

    public function pop(){

        $r $this->head->next->val;

        $this->delete(0);

        return $r;

    }

}

Copy after login

1

2

3

4

5

6

7

8

<?php         $stack = new LinklistStack();

        $stack->push(1);

        $stack->push(3);

        $stack->push(6);

        $stack->push(9);

 

        print_r($stack->pop());

        print_r($stack->head);

Copy after login

Linked list implementation queue

A brief discussion on how to implement and process linked lists in PHP

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<?php /**

 * 链表实现队列

 * Class LinkListQueue

 * @package app\models

 */

class LinkListQueue extends Linklist

{

    public $tail;    //尾节点

 

    /**

     * push

     * @param $value

     */

    public function push( $value ){

 

        if( $this->head->val==null ){

            $this->tail = new Node( $value );

            $this->head = $this->tail;

        }else{

            $this->tail->next =  new Node( $value );

            $this->tail = $this->tail->next;

        }

        $this->size++;

    }

 

    /**

     * pop

     * @return null

     * @throws \Exception

     */

    public function pop(){

        if$this->sizehead->val;

        $this->head = $this->head->next;

 

        $this->size--;

        return $val;

    }

 

    /**

     * 查看队首

     */

    public function checkHead(){

        return $this->head->val;

    }

 

    /**

     * 查看队尾

     */

    public function checkEnd(){

        return $this->tail->val;

    }

 

    /**

     * toString

     */

    public function toString(){

        $r = [];

        while$this->head ){

            $r[] = $this->head->val;

            $this->head = $this->head->next;

        }

        return implode('->',$r);

    }

}

Copy after login

Test

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?php $stack = new LinkListQueue();

        $stack->push(1);

        $stack->push(3);

        $stack->push(6);

        $stack->push(9);

 

        print_r($stack->pop());

        print_r($stack->head);

        print_r($stack->checkHead());

        print_r($stack->checkEnd());

        print_r($stack->toString());

/**        

1

app\models\Node Object

(

    [val] => 3

    [next] => app\models\Node Object

        (

            [val] => 6

            [next] => app\models\Node Object

                (

                    [val] => 9

                    [next] => 

                )

 

        )

 

)

3

9

3->6->9

**/

Copy after login

For more programming-related knowledge, please visit: Programming Video! !

The above is the detailed content of A brief discussion on how to implement and process linked lists in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles