创建链表时的一个小bug

问题

Linklist p = new LNode;
    p=L;
Linklist p = L;

有区别吗?

是的,这两种写法是有区别的。

Linklist p = new LNode; p=L; 这段代码中,首先创建了一个新的节点 p,然后将 L 的值赋给了 p。但是,这并不会改变 L 本身。因此,当我们向 p 添加新的节点时,这些节点并没有被添加到 L 中。

而在 Linklist p = L; 这段代码中,我们直接将 L 的值赋给了 p,并没有创建新的节点。这样,当我们向 p 添加新的节点时,这些节点实际上是被添加到了 L 中。

所以,如果想要修改链表 L,应该使用 Linklist p = L; 这种写法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表解决约瑟夫问题,如果间隔为1,从第一个小孩开始数,会出现bug的原因是,每次删除节点,需要先将当前节点的“前一个节点”的next指针指向当前节点的“后一个节点”,但是第一个节点没有“前一个节点”,需要特殊处理。 可以通过使用带头结点的链表来解决这个问题。具体实现如下: ```c++ #include<iostream> using namespace std; class Node { public: int data; Node* next; Node(int d) { data = d; next = nullptr; } }; class Josephus { private: Node* head; int n, m; public: Josephus(int n, int m) { this->n = n; this->m = m; head = new Node(0); // 创建头结点 Node* tail = head; for (int i = 1; i <= n; i++) { Node* newNode = new Node(i); tail->next = newNode; tail = newNode; } tail->next = head->next; // 将尾结点的next指针指向头结点,形成循环链表 } void run() { Node* cur = head->next; // 从第一个节点开始数 Node* pre = head; // 前一个节点初始化为头结点 while (n > 1) { // 当链表中仅剩一个节点结束 for (int i = 1; i < m; i++) { // 数m个节点 pre = cur; cur = cur->next; } pre->next = cur->next; // 将当前节点从链表中删除 delete cur; cur = pre->next; // 继续从下一个节点开始数 n--; // 链表长度减1 } cout << "最后一个存活的小孩编号是:" << cur->data << endl; } }; int main() { int n = 5, m = 1; // n表示小孩的个数,m表示间隔数 Josephus j(n, m); j.run(); return 0; } ``` 在这个实现中,我们使用了带头结点的链表,将尾结点的next指针指向头结点,形成循环链表。在删除当前节点,我们需要将当前节点的“前一个节点”的next指针指向当前节点的“后一个节点”,因此需要记录前一个节点的位置,同需要注意特殊处理第一个节点的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值