旋转链表 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;
  }

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

输出应为 5->6->1->2->3->4,

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

您没有修改原始列表(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->next=NULL很奇怪;您应该在 knode 之前的节点上执行此操作(这就是从结果中删除 6 的原因)。

>SJuan 的方法是正确的,但如果你想在不使用返回值的情况下按照自己的方式做到这一点,那么你需要对 node 使用双指针。请记住,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;
}
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;
    }

相关内容

  • 没有找到相关文章

最新更新