返回

打破常规,直击痛点:一步步剖析链表的逆置之道

前端

在计算机科学中,链表是一种重要的数据结构,它由一系列相互连接的节点组成,每个节点包含数据和指向下一个节点的指针。链表的逆置是一种基本的操作,它将链表的顺序从头到尾颠倒过来。

链表逆置有两种常见的方法:

  • 迭代法:

这种方法通过使用两个指针来实现,一个指针指向当前节点,另一个指针指向下一个节点。当前指针移动到下一个节点,并将下一个节点的指针指向当前节点。如此反复,直到当前指针到达链表的最后一个节点。最后,将最后一个节点的指针指向空,表示链表的结束。

  • 递归法:

这种方法通过使用递归来实现。基本思想是将链表分成两部分:第一部分是当前节点,第二部分是剩余的链表。对第二部分进行递归调用,将剩余的链表逆置。然后,将当前节点的指针指向第二部分的开头,将第二部分的开头指向当前节点。最后,返回逆置后的链表。

// C++ code for reversing a linked list

// A linked list node
struct Node {
    int data;
    Node* next;
};

// Function to reverse a linked list using iterative method
Node* reverseListIterative(Node* head) {
    Node* prev = NULL;
    Node* current = head;
    Node* next;

    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }

    return prev;
}

// Function to reverse a linked list using recursive method
Node* reverseListRecursive(Node* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }

    Node* newHead = reverseListRecursive(head->next);

    head->next->next = head;
    head->next = NULL;

    return newHead;
}

// Function to print a linked list
void printList(Node* head) {
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }

    cout << endl;
}

// Driver code
int main() {
    Node* head = new Node{1, new Node{2, new Node{3, new Node{4, new Node{5, NULL}}}}};

    cout << "Original list: ";
    printList(head);

    head = reverseListIterative(head);

    cout << "Reversed list (iterative method): ";
    printList(head);

    head = reverseListRecursive(head);

    cout << "Reversed list (recursive method): ";
    printList(head);

    return 0;
}

链表的逆置在许多场景中都有应用,例如:

  • 将链表中的元素倒序输出
  • 查找链表中的倒数第k个元素
  • 将两个链表合并成一个链表
  • 将链表分成两半

掌握链表的逆置方法对于数据结构的学习和应用都非常重要。