我目前正在解决列表和函数的和问题,我遇到了这个问题,即用逆时针方向旋转一个链表。 这是相同的代码
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-> 4。 5。 需要帮助:)
答案 0 :(得分:3)
您没有修改原始列表(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的节点)。
答案 1 :(得分:2)
SJuan的方法是正确的但是如果你想按照自己的方式去做而不使用返回值,那么你需要为节点使用双指针。请记住,C会复制您传递给函数的变量。如果原始根节点是一个指针(我假设它是),而不是你需要指针指针,否则你只是更改根节点指针的副本,而不是实际的根节点指针。 / p>
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;
}
答案 2 :(得分:0)
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;
}