>  기사  >  백엔드 개발  >  PHP에서 이중 연결 목록을 구현하기 위한 예제 코드

PHP에서 이중 연결 목록을 구현하기 위한 예제 코드

WBOY
WBOY원래의
2016-07-25 08:57:401262검색
  1. /**
  2. * **이중 연결 목록
  3. * @author zhiyuan12@
  4. * @modified 2012-10-25
  5. * @site: bbs.it-home.org
  6. */
  7. /**
  8. * 연결리스트 요소 노드 클래스
  9. */
  10. class Node_Element {
  11. public $pre = NULL; // 선행자
  12. public $next = NULL; // 후임자
  13. public $key = NULL; // 요소 키 값
  14. public $data = NULL; > function __Construct($key, $data) {
  15. $this->key = $key
  16. $this->data = $data;
  17. }
  18. / * *
  19. * 이중 연결 리스트 클래스
  20. */
  21. class DoubleLinkedList {
  22. private $head; // 헤드 포인터
  23. private $tail; // 테일 포인터
  24. private $current; // 현재 포인터 len; // 연결 리스트 길이
  25. function __Construct() {
  26. $this->head = self::_getNode ( null, null )
  27. $this->curelement = $this-> head;
  28. $this->tail = $this->head;
  29. $len = 0
  30. }
  31. /**
  32. * @ desc: 연결리스트의 모든 노드 읽기
  33. */
  34. 공용 함수 readAll() {
  35. $tmp = $this->head;
  36. while ( $tmp->next !== null ) {
  37. $tmp = $tmp->next
  38. var_dump ( $ tmp->key, $tmp->data );
  39. }
  40. }
  41. 공개 함수 move($pos1, $pos2) {
  42. $pos1Node = $this->findPosition ( $ pos1 ); $pos2Node = $this->findPosition ( $pos2 )
  43. if ($pos1Node !== null && $pos2Node !== null) {
  44. $tmpKey = $pos1Node-> ;key;
  45. $tmpData = $pos1Node->data;
  46. $pos1Node->key = $pos2Node->key
  47. $pos1Node->data;
  48. $pos2Node->key = $tmpKey;
  49. $pos2Node->data = $tmpData
  50. return true
  51. }
  52. return false; **
  53. * @desc: 지정된 키워드의 노드 삭제
  54. *
  55. * @param: $key
  56. * 지정된 위치의 연결리스트 요소 키
  57. */
  58. 공개 함수 delete($key) {
  59. $pos = $this->find ( $key )
  60. if ($pos !== null) {
  61. $tmp = $pos;
  62. $last = null;
  63. $first = true
  64. while ( $tmp->next !== null && $tmp->next->key = == $key ) {
  65. $tmp = $tmp->next;
  66. if (! $first) {
  67. $this->delNode ( $last ) } else {
  68. $first = false;
  69. }
  70. $last = $tmp;
  71. }
  72. if ($tmp->next !== null) {
  73. $pos->pre ->next = $tmp->next;
  74. $tmp->next->pre = $pos->pre
  75. } else {
  76. $pos->pre-> ;next = null;
  77. }
  78. $this->delNode ( $pos )
  79. $this->delNode ( $tmp ); *
  80. * @desc: 지정된 위치의 노드 삭제
  81. *
  82. * @param: $key
  83. * 지정된 위치의 연결리스트 요소 키
  84. */
  85. 공용 함수 deletePosition($pos) {
  86. $tmp = $this->findPosition ( $pos )
  87. if ($tmp === null) {
  88. return true
  89. }
  90. if ($tmp === $this->getTail ()) {
  91. $tmp->pre->next =
  92. $this-> ;delNode ( $tmp );
  93. true를 반환합니다.
  94. }
  95. $tmp->pre->next = $tmp->next-> pre = $tmp->pre;
  96. $this->delNode ( $tmp )
  97. }
  98. /**
  99. * @desc: 지정된 키 값 앞에 노드를 삽입합니다.
  100. *
  101. * @param : $key
  102. * //지정된 위치에 연결된 목록 요소 키
  103. * @param: $data
  104. * //삽입할 연결리스트 요소 데이터
  105. * @param: $flag
  106. * //삽입 위치를 순차적으로 검색할지 여부
  107. */
  108. 공개 함수 insert($key, $data , $flag = true) {
  109. $newNode = self::_getNode ( $key, $data )
  110. $tmp = $this->find ( $key, $flag )
  111. if ( $tmp !== null) {
  112. $newNode->pre = $tmp->pre
  113. $newNode->next = $tmp->pre = $newNode ;
  114. $newNode->pre->next = $newNode
  115. }else {
  116. $newNode->pre = $this->tail;
  117. $this->tail->next = $newNode;
  118. $this->tail = $newNode;
  119. }
  120. $this->len ;
  121. }
  122. /**
  123. * @desc: 지정된 위치 앞에 노드 삽입
  124. *
  125. * @param : $pos
  126. * 연결리스트에 삽입할 위치 지정
  127. * @param : $key
  128. * 해당 위치의 연결리스트 요소 키 지정
  129. * @param: $data
  130. * 삽입할 연결리스트 요소 데이터
  131. */
  132. 공개 함수 insertPosition($pos, $key, $data) {
  133. $newNode = self::_getNode ( $key, $data );
  134. $tmp = $this->findPosition ( $pos );
  135. if ($tmp !== null) {
  136. $newNode->pre = $tmp->pre;
  137. $newNode->next = $tmp;
  138. $tmp->pre = $newNode;
  139. $newNode->pre->next = $newNode;
  140. } else {
  141. $newNode->pre = $this->tail;
  142. $this->tail->next = $newNode;
  143. $this->tail = $newNode;
  144. }
  145. $this->len ;
  146. true를 반환합니다.
  147. }
  148. /**
  149. * @desc: 키 값에 따라 지정된 위치 데이터를 쿼리
  150. *
  151. * @param: $key
  152. * //지정된 위치의 연결 리스트 요소 키
  153. * @ param: $flag
  154. * //순서대로 검색할지 여부
  155. */
  156. 공개 함수 find($key, $flag = true) {
  157. if ($flag) {
  158. $tmp = $this-> ;머리;
  159. while ( $tmp->next !== null ) {
  160. $tmp = $tmp->next;
  161. if ($tmp->key === $key) {
  162. return $tmp;
  163. }
  164. }
  165. } else {
  166. $tmp = $this->getTail ();
  167. while ( $tmp->pre !== null ) {
  168. if ($tmp->key === $key) {
  169. return $tmp;
  170. }
  171. $tmp = $tmp->pre;
  172. }
  173. }
  174. null 반환;
  175. }
  176. /**
  177. * @desc: 위치를 기준으로 지정된 위치 데이터를 쿼리합니다.
  178. *
  179. * @param: $pos
  180. * //지정된 위치의 연결 리스트 요소 키
  181. */
  182. 공개 함수 findPosition($pos) {
  183. if ($pos <= 0 || $pos > $this->len)
  184. null을 반환합니다.
  185. if ($pos < ($this->len / 2 1)) {
  186. $tmp = $this->head;
  187. $개수 = 0;
  188. while ( $tmp->next !== null ) {
  189. $tmp = $tmp->next;
  190. $개수 ;
  191. if ($count === $pos) {
  192. return $tmp;
  193. }
  194. }
  195. } else {
  196. $tmp = $this->tail;
  197. $pos = $this->len - $pos 1;
  198. $count = 1;
  199. while ( $tmp->pre !== null ) {
  200. if ($count === $pos) {
  201. return $tmp;
  202. }
  203. $tmp = $tmp->pre;
  204. $개수 ;
  205. }
  206. }
  207. null 반환;
  208. }
  209. /**
  210. * @desc: 연결리스트의 헤드 노드를 반환
  211. */
  212. 공개 함수 getHead() {
  213. return $this->head->next;
  214. }
  215. /**
  216. * @desc: 연결리스트의 꼬리 노드를 반환합니다
  217. */
  218. 공개 함수 getTail() {
  219. return $this->tail;
  220. }
  221. /**
  222. * @ desc: 연결리스트 노드 개수 쿼리
  223. */
  224. 공개 함수 getLength() {
  225. return $this->len;
  226. }
  227. 개인 정적 함수 _getNode($key, $data) {
  228. $newNode = new Node_Element ( $key, $data );
  229. if ($newNode === null) {
  230. echo "새 노드 실패!";
  231. }
  232. $newNode 반환;
  233. }
  234. 비공개 함수 delNode($node) {
  235. unset( $node );
  236. $this->len --;
  237. }
  238. }
  239. // $myList = new DoubleLinkedList ();
  240. // $myList->insert ( 1, "test1" );
  241. // $myList->insert ( 2, "test2" );
  242. // $myList->insert ( "2b", "test2-b" );
  243. // $myList->insert ( 2, "test2-c" );
  244. // $myList->insert ( 3, "test3" );
  245. // $myList->insertPosition ( 5, "t", "testt" );
  246. // $myList->readAll ();
  247. // 에코 " ";
  248. // $myList->deletePosition(0);
  249. // $myList->readAll ();
  250. // 에코 "..." . $myList->getLength ();
  251. // var_dump ( $myList->findPosition ( 3 )->data );
  252. ?>
코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.