当前位置:首页 > PHP教程 > php高级应用 > 列表

实现php删除链表中重复的结点

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-30 11:47:39 浏览: 评论:0 

在本篇文章中,我们给大家带来了关于php删除链表中重复的结点的相关知识点内容以及相关代码,有兴趣的朋友们参考下。

删除链表中重复的结点:

定义两个指针pre和current

两个指针同时往后移动,current指针如果与后一个结点值相同,就独自往前走直到没有相等的,pre指针next直接指向current指针的后一个,把相同的都跳过

  1. pre=linkList 
  2. current=linkList 
  3. while current!=null 
  4.   if current->data==current->next->data 
  5.     value=current->data 
  6.     while value==current->next->data 
  7.       current=current->next 
  8.     pre->next=current->next 
  9.   pre=pre->next 
  10.   current=current->next 
  11. return linkList 
  12.  
  13. <?php 
  14. class Node{ 
  15.     public $data; 
  16.     public $next; 
  17.     public function __construct($data=""){ 
  18.         $this->data=$data; 
  19.     }   
  20. } 
  21. //构造一个带重复的链表 
  22. $linkList=new Node(); 
  23. $linkList->next=null; 
  24. $temp=$linkList; 
  25. $node1=new Node(2); 
  26. $temp->next=$node1; 
  27. $temp=$node1; 
  28. $node2=new Node(2); 
  29. $temp->next=$node2; 
  30. $temp=$node2; 
  31. $node3=new Node(3); 
  32. $temp->next=$node3; 
  33. $temp=$node3; 
  34. $node4=new Node(3); 
  35. $temp->next=$node4; 
  36. $temp=$node4; 
  37. $node5=new Node(4); 
  38. $temp->next=$node5; 
  39. $node5->next=null; 
  40. function deleteDuplication($pHead){ 
  41.     $pre=$pHead->next;//当前都指向第一个结点 
  42.     $current=$pHead->next;//当前结点是第一个结点 
  43.     while($current!=null){ 
  44.         //如果当前结点值和当前结点的下一个结点值相同 
  45.         if($current->next!=null && $current->data==$current->next->data){ 
  46.             //保存当前结点值 
  47.             $val=$current->data; 
  48.             //当前结点往后移直到和下一个结点值不相等 
  49.             while($current->next!=null && $val==$current->next->data){ 
  50.                 $current=$current->next; 
  51.             }   
  52.             //前一个指针next直接指向当前结点的next 
  53.             $pre->next=$current->next; 
  54.         }   
  55.         //两个指针同时后移 
  56.         $pre=$pre->next; 
  57.         $current=$current->next; 
  58.     } 
  59.     return $pHead; 
  60. } 
  61. var_dump($linkList); 
  62. $result=deleteDuplication($linkList); 
  63. var_dump($result); 
  64.  
  65. object(Node)#1 (2) { 
  66.  ["data"]=> 
  67.  string(0) "" 
  68.  ["next"]=> 
  69.  object(Node)#2 (2) { 
  70.   ["data"]=> 
  71.   int(2) 
  72.   ["next"]=> 
  73.   object(Node)#3 (2) { 
  74.    ["data"]=> 
  75.    int(2) 
  76.    ["next"]=> 
  77.    object(Node)#4 (2) { 
  78.     ["data"]=> 
  79.     int(3) 
  80.     ["next"]=> 
  81.     object(Node)#5 (2) { 
  82.      ["data"]=> 
  83.      int(3) 
  84.      ["next"]=> 
  85.      object(Node)#6 (2) { 
  86.       ["data"]=> 
  87.       int(4) 
  88.       ["next"]=> 
  89.       NULL 
  90.      } 
  91.     } 
  92.    } 
  93.   } 
  94.  } 
  95. } 
  96. object(Node)#1 (2) { 
  97.  ["data"]=> 
  98.  string(0) "" 
  99.  ["next"]=> 
  100.  object(Node)#2 (2) { 
  101.   ["data"]=> 
  102.   int(2) 
  103.   ["next"]=> 
  104.   object(Node)#4 (2) { 
  105.    ["data"]=> 
  106.    int(3) 
  107.    ["next"]=> 
  108.    object(Node)#6 (2) { 
  109.     ["data"]=> 
  110.     int(4) 
  111.     ["next"]=> 
  112.     NULL 
  113.    } 
  114.   } 
  115.  } 
  116. }

Tags: php删除链表 php删除重复结点

分享到: