关于单链表中头指针、头结点、尾结点的问题

如题,对于单链表的头指针、头结点、和尾结点一直有点概念模糊。

void CreateListR(ListNode* &L, int a[], int n)
{
    L = (ListNode *)malloc(sizeof(ListNode));
    L->next = nullptr; //建立空表
    ListNode *s;
    ListNode *r;  //指向尾端结点
    r = L;

    for (int i = 0; i < n; i++)
    {
        s = (ListNode *)malloc(sizeof(ListNode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = nullptr;  //最后将r->next置为nullptr
}

当我用如上尾插法建立一个单链表的时候,

 int a[5] = {1,2,3,4,3};
    ListNode *L;
    CreateListR(L, a, 5);

最后得到的单链表是不是如图所示:

图片描述

就是有一个头结点,其不为nullptr,但是没有存data,最后r->next = nullptr;这是将最后一个有值的结点的next指针指向了一个nullptr,所以是不是其实最后还有一个尾结点,这个结点为nullptr,但是如果统计结点的时候其实它也是一个结点的存在?

另外,当我创建好了单链表过后,如果我其他函数需要用到该表,例如:

 int ListLength(ListNode* L)
{
    int length = 0;
    ListNode *p = L;
    while (p->next != nullptr)
    {
        length++;
        p = p->next;
    }
    return length;
}

我传入的L是不是之前创建的链表的头结点(就是没有存储data,next指针指向第一个真正存储data的那一个结点)?

阅读 4.1k
1 个回答

最后得到的单链表是不是如图所示:——是

所以是不是其实最后还有一个尾结点,这个结点为nullptr,但是如果统计结点的时候其实它也是一个结点的存在?——这里有个两个问题,前半部分,后面没有尾节点了,那个nullptr是保存数字5的那个节点的next指针的值。指针指向内存地址,如果指向nullptr的话,表明不对应任何内存地址,所以不存在这个尾节点。统计节点的时候,这个节点也不存在,不能统计进去。

我传入的L是不是之前创建的链表的头结点(就是没有存储data,next指针指向第一个真正存储data的那一个结点)?——算是对的,但是更严格的讲,L是指向你创建的链表的头节点的指针,它指向你创建的头节点。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题