我想构建一个程序,它从链接列表的开头获取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);
}
答案 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的最后一个节点,而是将其指向列表中的第一个节点。这种类型列表的另一个技巧是保留对最后一个节点的引用,而不是第一个节点。现在只需通过正确的节点数更改列表引用即可解决问题。
循环链接列表的其他优点是,附加到开头或结尾现在是微不足道的,这种优势不会使列表中的其他操作变得更难。