我正在解决在给定大小的组中反转链表的问题,我使用的算法如下:
1)反转大小为k的第一个子列表。在反转时,我保留了下一个节点和前一个节点的轨道。让指向下一个节点的指针是下一个节点,指向前一节点的指针是prev&指向当前节点的指针是ptr。
2)head = reverse(next,k) - 递归调用列表的其余部分
3)返回prev,这是反向列表的新头
我的代码示例是:
struct node *reverse(struct node *start,int k)
{
struct node *prev,*ptr,*next;
prev=NULL;
ptr=start;
int count=0;
while(count<k && ptr!=NULL)
{
next=ptr->link;
ptr->link=prev;
prev=ptr;
ptr=next;
count++;
}
if(next!=NULL)//recursive call
start=reverse(next,k);
return prev;
}
但是我的输出只是颠倒了列表的前半部分!
例如:如果我的名单是:98 74 94 857 8 7
My output is : 94 74 98(The rest is not being displayed)
我哪里错了?..这种方法是否正确?
答案 0 :(得分:2)
进行递归调用时:
if(next!=NULL)//recursive call
start=reverse(next,k);
return prev;
您在start
中保存递归调用的结果,您再也不会参考了这一结果。当控制从函数传递时指针到期,并且递归调用的结果(即,超出第一个k
元素的任何内容)将丢失。您必须在返回之前将这些结果附加到反转的子列表中。
答案 1 :(得分:0)
if(next!=NULL)//recursive call
start->next=reverse(next,k);
return prev;
接下来会有第(k + 1)个节点的存储位置。当我们开始 - >下一个(第k + 1)个节点成为新头并且