【问题标题】:singly linked list insertion issue单链表插入问题
【发布时间】:2020-09-13 01:44:55
【问题描述】:

我试图在链表末尾插入元素,但如果我在 while 循环中注释中断,它会进入一个连续循环,我无法弄清楚原因

代码:

head=NULL;
node *temp=head;

for(int i=0;i<5;i++)
{
    //temp=head;
    node* t1=new node;
        
    if(head==NULL)
    {
        t1->a=i;
        t1->next=NULL;
        head=t1;
    }
    else
    {
        temp=head;
        while(temp!=NULL)
        {
            if(temp->next==NULL)
            {
                t1->a=i;
                t1->next=NULL;
                temp->next=t1;
                //break;
            }
            temp=temp->next;
        }
    }
}

temp=head;
while(temp!=NULL)
{
    cout<<temp->a<<endl;
    temp=temp->next;
} 

【问题讨论】:

    标签: c++ linked-list


    【解决方案1】:

    您的 while 循环试图一次又一次地遍历您刚刚添加的新节点。此处插入操作后中断循环是正确的,否则while循环可能会无限循环。

    【讨论】:

      【解决方案2】:

      您的while 循环在没有break 的情况下永远运行,因为temp 永远不会设置为NULL 来停止循环。当while 循环到达列表中的最后一个节点时,它将新节点附加到末尾,然后将temp 设置为该节点。所以下一次循环迭代会看到那个节点,一次又一次地追加,一次又一次,无休止地。

      所以,当到达最后一个节点时,您需要break while 循环:

      for(int i = 0; i < 5; i++)
      {
          node* t1 = new node;
          t1->a = i;
          t1->next = NULL;
      
          if (head == NULL)
          {
              head = t1;
          }
          else
          {
              node *temp = head;
              while (temp != NULL)
              {
                  if (temp->next == NULL)
                  {
                      temp->next = t1;
                      break;
                  }
                  temp = temp->next;
              }
          }
      }
      

      在这种情况下,while 循环可以简化为根本不需要break

      for(int i = 0; i < 5; i++)
      {
          node* t1 = new node;
          t1->a = i;
          t1->next = NULL;
      
          if (head == NULL)
          {
              head = t1;
          }
          else
          {
              node *temp = head;
              while (temp->next != NULL)
              {
                  temp = temp->next;
              }
              temp->next = t1;
          }
      }
      

      话虽如此,整个代码可以进一步大大简化,在外部for 循环的每次迭代中不重复整个列表,并且不使用if.. else 来决定是否设置@ 987654334@:

      node **temp = &head;
      while (*temp != NULL)
      {
          temp = &((*temp)->next);
      }
      
      for(int i = 0; i < 5; i++)
      {
          node* t1 = new node;
          t1->a = i;
          t1->next = NULL;
      
          *temp = t1;
          temp = &(t1->next);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多