为什么打印时我的输出没有显示包含 14 的节点?

问题描述

为什么我的输出在打印时没有显示包含 14 的节点?

我想我在实现链表时遗漏了一些关键原则:

#include<iostream>
using namespace std;
struct ListNode
{
    int value;
    ListNode *next;
    ListNode(int d,ListNode* p=NULL) //constructor
    {
        value=d;
        next=p;
    }
};

int main()
{
    ListNode* header=NULL;
    header=new ListNode(5);
    ListNode* ptr=header; //pointer to find the correct position

    ListNode* sptr=new ListNode(13);
    header->next=sptr;
    ListNode* tptr=new ListNode(19);
    sptr->next=tptr;
    ListNode* t=new ListNode(14);
    while((ptr->value) < (t->value))
    {
        ptr=ptr->next;
    }

    ListNode* g=ptr;
    ptr=t;
    t->next=g;

    while(header!=NULL)
    {
        cout<<header->value<<" ";
        header=header->next;
    }

    return 0;
}

解决方法

您没有将值为 14 的节点添加到列表中。即列表中的两个节点都没有指向在此声明中创建的节点

 ListNode* t=new ListNode(14);

你所做的只是将节点的 next 数据成员设置为值为 19 的节点地址。

ListNode* g=ptr;
ptr=t;
t->next=g;

这里是声明

ptr=t;

没有效果。

如果在这个循环之后

while(header!=NULL)
{
    cout<<header->value<<" ";
    header=header->next;
}

你将把这个代码片段放在你的程序中

cout << '\n';

while ( ptr != NULL )
{
    cout<<ptr->value<<" ";
    ptr=ptr->next;
}

你会得到程序输出

5 13 19 
14 19 

说清楚然后注意这个循环之后

  while((ptr->value) < (t->value))
  {
    ptr=ptr->next;
  }

指针 ptr 指向值为 19 的节点。并且您不能使用指针在该节点之前插入值为 14 的新节点,因为您有一个单向链表,并且该节点为值 19 只有一个指向下一个节点的引用。

因此,您可以使用while循环后获得的指针ptr,仅在值为19的节点之后插入值为14的新节点。

如果您想在值为 19 的节点之前插入值为 14 的新节点,则不要使用此代码段

  while((ptr->value) < (t->value))
  {
    ptr=ptr->next;
  }
  
ListNode* g=ptr;
ptr=t;
t->next=g;

你应该像下面这样写

  ListNode *prev = nullptr;   
  while( ptr != nullptr && ptr->value < t->value )
  {
    prev = ptr;
    ptr=ptr->next;
  }
  
  t->next = ptr;
  prev == nullptr ? header = t : prev->next = t;