如何在链表中将节点从开始移动到结尾? C

时间:2016-06-10 11:46:32

标签: c linked-list nodes temp

我想构建一个程序,它从链接列表的开头获取K个元素并将它们放在链接链接的末尾,有点旋转。 例如:如果存在链表:1-> 2-> 3-> 4-> 5 并且k = 2然后链表将看起来像这样:3-> 4-> 5-> 1-> 2 这是我的尝试,请帮助我:

void spinfunc(struct node *node_ptr)
{
    int k = 0;
    int count = 0;
    int temp;
    printf("enter a number of the lements from the begin to be deleted - ");
    scanf("%d", &k);
    while (node_ptr != NULL)
    {
        if (count + 1 <= k)
        {
            count++;
            printf("count: %d", count);
            temp = node_ptr->data;
            node_ptr->data = NULL;
        }
        node_ptr = node_ptr->next;
    }
    printf("%d ", temp);

}

2 个答案:

答案 0 :(得分:3)

可以通过更简单的步骤完成。

我们只需要改变第k个节点的下一个指针和列表的尾节点即

kth node -> next = null
tail node -> next = head

然后将头部更新为第(k + 1)个节点。

整体逻辑:

从第k个节点开始遍历列表并在第k个节点停止。存储指向第k个节点的指针。我们可以使用kthNode-&gt;接下来获得第(k + 1)个节点。继续遍历直到结束并将指针存储到最后一个节点。最后,如上所述更改指针。

struct node* spinFunc(struct node *head)

{

int k = 2; //assuming k = 2 
// list = 1->2->3->4->5.
struct node* current = head;
struct node* newHead = NULL;

int count = 1;
while (count < k && current != NULL)
{
    current = current->next;
    count++;
}
//Now current is pointing to node 2 

// current points to kth node. Store it in a variable.
struct node *kthNode = current;

// current will point to last node i.e. node 5 after this loop
while (current->next != NULL)
    current = current->next;

//last node -> next = head
current->next = head;

//update the head now
newHead = kthNode -> next;

kthNode->next = NULL;

//return the new head
return newHead;

}

答案 1 :(得分:0)

就我个人而言,我喜欢采用的方法是使用循环链接列表。而不是链接列表中指向Null的最后一个节点,而是将其指向列表中的第一个节点。这种类型列表的另一个技巧是保留对最后一个节点的引用,而不是第一个节点。现在只需通过正确的节点数更改列表引用即可解决问题。

循环链接列表的其他优点是,附加到开头或结尾现在是微不足道的,这种优势不会使列表中的其他操作变得更难。