Учитывая Единственный связанный список $ link, с элементами (a-> b-> c-> d-> e-> f-> g-> h-> i-> j), нам нужно реверсировать связанный список при условии, что реверсирование будет выполнено таким образом, как —
Обратный 1-й элемент (а)
Переверните следующие 2 элемента (a-> c-> b)
Переверните следующие 3 элемента (a-> c-> b-> f-> e-> d)
Поменяйте местами следующие 4 элемента (a-> c-> b-> f-> e-> d-> j-> i-> h-> g)
….
….
Я ищу код функции PHP, который берет связанный список $ link и переворачивает его описанным выше способом с наименьшей сложностью.
Для справки, я добавляю свой код ниже для связанного списка. Функция reverseLinkedList должна быть завершена, чтобы выполнить эту конкретную обратную операцию —
class ListNode
{
public $data;
public $next;
function __construct($data)
{
$this->data = $data;
$this->next = NULL;
}
function read_node()
{
return $this->data;
}
}
class LinkList
{
private $first_node;
private $last_node;
private $count;
function __construct()
{
$this->first_node = NULL;
$this->last_node = NULL;
$this->count = 0;
}
function size()
{
return $this->count;
}
public function read_list()
{
$listData = array();
$current = $this->first_node;
while($current != NULL)
{
echo $current->read_node().' ';
$current = $current->next;
}
}
public function reverse_list()
{
if(($this->first_node != NULL)&&($this->first_node->next != NULL))
{
$current = $this->first_node;
$new = NULL;
while ($current != NULL)
{
$temp = $current->next;
$current->next = $new;
$new = $current;
$current = $temp;
}
$this->first_node = $new;
}
}
public function read_node($position)
{
if($position <= $this->count)
{
$current = $this->first_node;
$pos = 1;
while($pos != $position)
{
if($current->next == NULL)
return null;
else
$current = $current->next;
$pos++;
}
return $current->data;
}
else
return NULL;
}
public function insert($data)
{
$new_node = new ListNode($data);
if($this->first_node != NULL)
{
$this->last_node->next = $new_node;
$new_node->next = NULL;
$this->last_node = &$new_node;
$this->count++;
}
else
{
$new_node->next = $this->first_node;
$this->first_node = &$new_node;
if($this->last_node == NULL)
$this->last_node = &$new_node;
$this->count++;
}
}
}//Create linked list
$link1 = new LinkList();
//Insert elements
$link1->insert('a');
$link1->insert('b');
$link1->insert('c');
$link1->insert('d');
$link1->insert('e');
$link1->insert('f');
$link1->insert('g');
$link1->insert('h');
$link1->insert('i');
$link1->insert('j');
echo "<b>Input :</b><br>";
$link1->read_list();//function to reverse linked list in specified manner
function reverseLinkedList(&$link1)
{
//Logic to reverse the linked list $link1
}
///function to reverse linked list in specified manner
//Reverse current linked list $link1
reverseLinkedList($link1);
echo "<br><br><b>Output :</b><br>";
$link1->read_list();
Задача ещё не решена.
Других решений пока нет …