在给定大小的组中反转链表

时间:2013-05-09 03:29:49

标签: c algorithm linked-list

我正在解决在给定大小的组中反转链表的问题,我使用的算法如下:

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)

我哪里错了?..这种方法是否正确?

2 个答案:

答案 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)个节点成为新头并且