【问题标题】:Rotating a Linked List C循环链表 C
【发布时间】:2013-09-27 18:26:50
【问题描述】:

我目前正在解决列表和函数的求和问题,我遇到了这个问题,即将链表逆时针旋转 k。 这是相同的代码

void rotate_k(struct list *node,int k)
{
   int count=0;
   struct list *knode,*ptr=node;
   while(ptr!=NULL && count < k)
    {
      ptr=ptr->next;
      count++; 
     }
    knode=ptr;
    while(ptr->next!=NULL)
     {
      ptr=ptr->next;
      }
    ptr->next =node;
    node=knode->next;
    knode->next=NULL;
  }

假设输入是 1->2->3->4->5->6 和 k=4。

输出应该是 5->6->1->2->3->4 但代码给出输出 1->2->3->4->5 。 需要帮助:)

【问题讨论】:

  • 调试器说了什么?
  • 想想列表需要做什么。找到第 k 个元素;使它成为新的头,使旧的尾巴指向旧的头。我没有看到执行最后两部分的代码。同时返回新的头部
  • 第二个 while 循环到列表的末尾,ptr->next=node 使尾部指向旧的头部。 node=knode->next 使 5 个新的列表头

标签: c linked-list


【解决方案1】:

您没有修改原始列表(node 参数)

struct list *rotate_k(struct list *node,int k)
{
   int count=0;
   struct list *knode,*ptr=node;
   while(ptr!=NULL && count < k)
   {
      ptr=ptr->next;
      count++; 
   }
   knode=ptr;
   while(ptr->next!=NULL)
   {
      ptr=ptr->next;
   }
   ptr->next =node;
   node=knode->next;     
   knode->next=NULL;

   return knode; //<-- THIS IS THE NEW LIST
}

另外,knode-&gt;next=NULL 很奇怪;您应该在(之前)knode 之前的节点上执行此操作(这是从结果中删除 6 的原因)。

【讨论】:

  • 根据我从您的代码(和结果)中读取的内容,knode 指向 5,这是您想要的元素。无论如何测试它。
【解决方案2】:

SJuan 的方法是正确的,但是如果你想按照自己的方式做而不使用返回值,那么你需要为节点使用双指针。请记住,C 会复制您传递给函数的变量。如果原始根节点是一个指针(我假设它是),那么您需要创建一个指向指针的指针,否则您只是更改根节点指针的副本,而不是实际的根节点指针。

void rotate_k(struct list **node, int k)
{
   int count = 0;
   struct list *knode, *ptr = *node;
   while(ptr != NULL && count < k)
   {
      ptr = ptr->next;
      count++; 
   }
   knode = ptr;
   while(ptr->next != NULL)
   {
      ptr = ptr->next;
   }
   ptr->next = *node;
   *node = knode->next;     
   knode->next = NULL;
}

【讨论】:

    【解决方案3】:
    void rotate_list_right(listnode** head, int k)
        {
        if( !head || !*head )
            {
            printf( "\nrotate_list_right: empty list = so return \n" );
            return;
            }
        if( k < 1 )
            {
            printf( "\nrotate_list_right:invalid input: k must be >= 1 \n" );
            return;
            }
    
        listnode* post = *head;
        listnode* curr = *head;
    
        /* move post by k nodes */
        while(k--)
            {
            post = post->next;
            if( !post ) /* k is bigger than length of the list */
                {
                printf( "\nrotate_list_right:invalid input: k must be smaller than list size \n" );
                return;
                }
            }
    
        /* move curr to kth-last node */
        while(post->next)
            {
            curr = curr->next;
            post = post->next;
            }
    
        /* currs' next is new header */
        listnode* tmp = *head;
        *head = curr->next;
        curr->next = 0;
    
        //join post
        post->next = tmp;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2017-07-29
      • 2019-02-16
      相关资源
      最近更新 更多