php单链表怎么翻转
-
要翻转一个单链表,可以采取迭代或递归的方法。
迭代法:
1. 声明三个指针,分别为prev、current和next,并将它们初始化为null。
2. 使用while循环遍历链表,其中循环条件为当前节点不为空:
a. 将next指针指向当前节点的下一个节点,保存当前节点的后继节点。
b. 将当前节点的next指针指向prev,即将当前节点的后继指针指向它的前一个节点。
c. 将prev指针指向当前节点,将current指针指向next,即将prev和current向后移动一个节点。
3. 当循环结束时,将链表的头结点指向prev,即将链表的方向翻转过来。递归法:
1. 声明一个递归函数reverseList,该函数的参数为当前节点,返回翻转后的链表头结点。
2. 在递归函数内部,先处理递归终止条件:如果当前节点为空或者它的后继节点为空,则直接返回当前节点作为翻转后的链表头结点。
3. 否则,递归调用reverseList函数,将当前节点的后继节点作为参数。
4. 在递归函数返回后,将当前节点的后继节点的后继指针指向当前节点,将当前节点的后继指针置为null,即完成了当前节点与其后继节点的翻转。
5. 最后,返回翻转后的链表头结点。以上是两种常见的翻转单链表的方法,可以根据实际情况选择合适的方法进行实现。希望对你有帮助!
2年前 -
翻转一个单链表是常见的面试问题之一,也是对数据结构的一次练习。单链表是一种线性数据结构,由一个个节点组成,每个节点都包含一个指向下一个节点的指针。翻转单链表就是将链表中节点的顺序颠倒,原先指向下一个节点的指针指向前一个节点。
下面将介绍如何用PHP实现单链表的翻转:
1. 创建链表的节点类:
首先,需要创建一个链表的节点类,具体实现如下:
“`php
class ListNode {
public $val;
public $next;public function __construct($val = 0, $next = null) {
$this->val = $val;
$this->next = $next;
}
}
“`2. 创建单链表:
创建单链表需要先定义一个头结点,然后根据给定的数据构建链表。下面是一个简单的示例:
“`php
function createLinkedList($data) {
$head = new ListNode();
$curr = $head;foreach ($data as $val) {
$node = new ListNode($val);
$curr->next = $node;
$curr = $node;
}return $head->next;
}
“`3. 翻转单链表:
翻转单链表的方法有很多种,这里介绍两种常见的方法。
方法一:迭代法
迭代法是用循环来翻转链表。具体实现如下:
“`php
function reverseLinkedList($head) {
$prev = null;
$curr = $head;while ($curr != null) {
$temp = $curr->next;
$curr->next = $prev;
$prev = $curr;
$curr = $temp;
}return $prev;
}
“`方法二:递归法
递归法是通过递归函数来翻转链表。具体实现如下:
“`php
function reverseLinkedList($head) {
if ($head == null || $head->next == null) {
return $head;
}$newHead = reverseLinkedList($head->next);
$head->next->next = $head;
$head->next = null;return $newHead;
}
“`4. 遍历和输出翻转后的链表:
为了验证翻转链表的结果,可以遍历新的链表,并输出每个节点的值。具体实现如下:
“`php
function printLinkedList($head) {
$curr = $head;while ($curr != null) {
echo $curr->val . ” “;
$curr = $curr->next;
}
}
“`5. 测试代码:
最后,可以编写一段测试代码来验证翻转链表的结果:
“`php
$data = [1, 2, 3, 4, 5];
$head = createLinkedList($data);
$reversedHead = reverseLinkedList($head);
printLinkedList($reversedHead);
“`以上就是用PHP实现单链表翻转的步骤和代码。翻转链表是一个常见的算法问题,掌握了这个方法之后,可以应用到多种场景中。希望这篇文章对你有所帮助!
2年前 -
要将单链表翻转,可以按照以下步骤进行操作:
1. 创建一个新的指针变量,称为`prev`,并将其初始化为 `NULL`。
2. 创建另一个指针变量,称为`current`,并将其初始化为指向链表的头节点`head`。
3. 创建一个额外的指针变量,称为`next`,用于临时存储`current`指针变量的下一个节点。
4. 进行循环操作,直到`current`为空为止。
1. 将`next`指针变量指向`current`的下一个节点。
2. 将`current`的`next`指针指向`prev`,完成节点的翻转。
3. 将`prev`指针指向`current`,将`current`指针指向`next`。
5. 更新链表的头节点`head`为`prev`。
6. 返回翻转后的链表。下面是对应的PHP代码实现:
“`php
class Node {
public $value; // 节点的值
public $next; // 下一个节点的指针public function __construct($value) {
$this->value = $value;
$this->next = NULL;
}
}class LinkedList {
private $head; // 链表的头节点public function __construct() {
$this->head = NULL;
}// 在链表末尾添加一个节点
public function append($value) {
$newNode = new Node($value);
if ($this->head == NULL) {
$this->head = $newNode;
} else {
$current = $this->head;
while ($current->next != NULL) {
$current = $current->next;
}
$current->next = $newNode;
}
}// 翻转链表
public function reverse() {
$prev = NULL;
$current = $this->head;
while ($current != NULL) {
$next = $current->next;
$current->next = $prev;
$prev = $current;
$current = $next;
}
$this->head = $prev;
}// 打印链表的值
public function printList() {
$current = $this->head;
while ($current != NULL) {
echo $current->value . ” “;
$current = $current->next;
}
}
}// 创建一个链表
$linkedList = new LinkedList();
$linkedList->append(1);
$linkedList->append(2);
$linkedList->append(3);
$linkedList->append(4);
$linkedList->append(5);// 打印原链表
echo “原链表:”;
$linkedList->printList();
echo “\n”;// 翻转链表
$linkedList->reverse();// 打印翻转后的链表
echo “翻转后的链表:”;
$linkedList->printList();
“`运行以上代码,输出结果为:
“`
原链表:1 2 3 4 5
翻转后的链表:5 4 3 2 1
“`以上代码实现了单链表的翻转功能。首先通过创建`Node`类和`LinkedList`类来表示链表和节点。在`LinkedList`类中,我们实现了`append`方法用于在链表末尾添加节点,`reverse`方法用于翻转链表,`printList`方法用于打印链表的值。
在`reverse`方法中,我们使用`prev`、`current`和`next`三个指针变量来进行链表节点的翻转操作。我们通过循环遍历链表并依次将当前节点的`next`指针指向`prev`,同时更新`prev`和`current`指针。最后将链表头节点指向`prev`,完成链表的翻转。
通过以上步骤,我们就成功实现了将单链表翻转的操作。
2年前