C++程序 寻找链表长度

C++程序 寻找链表长度

链表是一种常用的数据结构,它不像数组一样需要预先分配一定大小的内存,可以随时添加和删除数据。但是,链表的一个缺点是不方便查找长度。因此,本文将介绍如何编写一个C++程序来计算链表的长度。

链表的定义

链表是一组节点组成的集合,每个节点都包含两个部分,一个是数据部分,另一个是指向下一个节点的指针。链表的头节点是第一个节点,也就是整个链表的起点。

下面是一个简单的链表定义示例,包含了节点的数据类型和链表的数据类型:

struct ListNode {
    int val;        // 节点的数据部分
    ListNode *next; // 节点的指针部分,指向下一个节点
    ListNode(int x) : val(x), next(NULL) {}
};

class LinkedList {
public:
    ListNode *head; // 链表头节点
    LinkedList() { head = NULL; } // 构造函数,初始化链表为空
};

计算链表长度

要计算链表的长度,我们只需要从头节点开始顺序遍历整个链表,直到遇到空节点为止。为了方便起见,我们可以编写一个函数来计算链表长度。

下面是使用循环的方法来实现计算链表长度的函数:

int getLength(LinkedList *list) {
    int len = 0;
    ListNode *p = list->head;
    while (p != NULL) {
        ++len;
        p = p->next;
    }
    return len;
}

函数中使用一个计数器len来记录链表的长度,指针p用来指向当前节点。循环中不断将p指向下一个节点,直到p指向空节点为止,此时链表长度为len。

我们也可以使用递归的方法来计算链表长度,如下所示:

int getLengthRecursion(ListNode *node) {
    if (node == NULL) {
        return 0; // 空节点的长度为0
    } else {
        return 1 + getLengthRecursion(node->next); // 不断递归到下一个节点
    }
}

函数中如果节点为空,则长度为0;否则不断递归到下一个节点,一直到最后一个节点,返回的是递归到该节点的长度+1。

使用示例

我们可以编写一个主函数,来验证计算链表长度的函数是否正确。

下面是一个使用示例,包含了链表的添加和输出功能,以及计算链表长度的功能:

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class LinkedList {
public:
    ListNode *head;
    LinkedList() { head = NULL; }
    void addNode(int val) {
        if (head == NULL) {
            head = new ListNode(val);
        } else {
            ListNode *p = head;
            while (p->next != NULL) p = p->next;
            p->next = new ListNode(val);
        }
    }
    void printList() {
        ListNode *p = head;
        while (p != NULL) {
            cout << p->val << " ";
            p = p->next;
        }
        cout << endl;
    }
};

int getLength(LinkedList *list) {
    int len = 0;
    ListNode *p = list->head;
    while (p != NULL) {
        ++len;
        p = p->next;
    }
    return len;
}

int main() {
    LinkedList list;
    list.addNode(1);
    list.addNode(2);
    list.addNode(3);
    list.addNode(4);
    list.addNode(5);
    list.printList();
    cout << "Length of the linked list: " << getLength(&list) << endl;
    return 0;
}

输出:

1 2 3 4 5 
Length of the linked list: 5

结论

计算链表长度是一个简单而常用的操作,可以使用循环和递归两种方法来实现。两种方法虽然代码不同,但本质相同,都是遍历整个链表,统计节点数量。在实际应用中,要根据具体情况选择不同的方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例