php单链表怎么翻转

fiy 其他 140

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    要翻转一个单链表,可以采取迭代或递归的方法。

    迭代法:
    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年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    翻转一个单链表是常见的面试问题之一,也是对数据结构的一次练习。单链表是一种线性数据结构,由一个个节点组成,每个节点都包含一个指向下一个节点的指针。翻转单链表就是将链表中节点的顺序颠倒,原先指向下一个节点的指针指向前一个节点。

    下面将介绍如何用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年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    要将单链表翻转,可以按照以下步骤进行操作:

    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年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部