繁体   English   中英

索引单链表

[英]Indexed singly linked list

我想创建一个单链表。 我已经有一个不允许在其上建立索引的实现。 我想添加此功能,但是我不确定该怎么做。

链表

因此,基本上头应该具有索引“ 1”。 但是我无法弄清楚自己应该如何在If语句中将索引每增加1

void AddNode (int addData)
{
    nodePtr NewNode = new node;
    NewNode->next = NULL;
    NewNode->data = addData;

    if (head != NULL)
    {
        curr = head;
        while(curr->next != NULL)
        {
            curr = curr->next;
        }
        curr->next = NewNode;
        NewNode->index;
    }
    else
    {
        head = NewNode;
        NewNode->index = 1;
    }
}

您是说能够通过get(index)获得链接列表节点等功能?

另外,您的头部不应该具有索引1,它应该为0。这不符合从零开始的标准索引编制方法。

链表在技术上没有索引,也不应存储索引。 似乎链表可能不是您正在执行的操作的正确数据结构,但是您可以使用这样的循环将其视为这样(请注意,如果我的c ++语法生锈)

int get(int index) {
  Node current = head;
  for (int x = 0; x < index; x++) {
    if (current->next == null) {
      //some sort of error handling for index out of bounds
    } else {
      current = current->next;
    }
  }
  return current->data
}

get(2)将返回列表的第三个元素。

结构图为什么要将其添加到列表的末尾? 只需将新节点添加到最前面即可。

我认为没有必要遵循1,2,3的顺序。。。相反,您可以反向进行。在添加新节点之前,请访问头并找到其索引(i)。 当您添加新的索引时,该索引的索引将为i + 1。

有两个优点:-遍历此列表时,它不会改变任何内容。 -您知道已添加到此列表中的数量。

所以,你真的想要做的是增加的能力链表的索引元素。

  • 无需将索引实际存储在任何地方(因为您实际上并不存储array/vector元素的索引,因为类型和数组第一个元素的地址就是检索第i-th元素所需要的一切)。

  • 你想保留的唯一信息是因为计算是昂贵的,因为你必须从遍历列表列表的长度headtail每次你需要它的时候。 获得此信息后, addNode仅应更新列表的size

如您所知,访问链表i-th元素也很昂贵(与向量相比),但是很容易编写代码。

类似于以下内容的东西应该起作用:

void get(Node* head, size_t pos) {
    while (head && pos--)
        head = head->next;
    return pos<=0 ? head : nullptr ;
}

head开始遍历列表,直到到达末尾( headnullptr )或pos <=0 一旦您退出循环,如果pos>0表示列表比pos短,则可以返回head (这将指向pos-th元素)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM