这是一个我在C中遇到麻烦的问题。 所以,我们有一个带有两个参数的函数:
K表示我们必须从列表的末尾移到列表开头的节点数,如下所示:
我知道如何移动一个元素,但我不能用tmps来解决K节点。
我将不胜感激任何建议。 这是一个节点的代码。
void Shift(node **head){
node *prev;
node *curr = *head;
while(curr != NULL && curr->next != NULL) {
prev = curr;
curr = curr->next;
}
prev->next = NULL;
curr->next = *head;
*head = curr;
}
答案 0 :(得分:3)
您可以在一个“步骤”中移动完整的K
个节点链。
假设列表包含N
个元素,nmk
是位置N-K
的节点,e
是列表的最后一个节点。那么代码就是......
e->next = *head;
*head = nmk->next;
nmk->next = NULL;
现在的诀窍是找到节点nmk
,但如果你不介意的话我会把它留给你:-)
并且不要忘记检查空列表,N==K
,....等角落案例。
答案 1 :(得分:0)
// Shift the last N nodes of a linked list to the front of
// the list, preserving node order within those N nodes.
//
// Returns -1 if there are not enough nodes, -2 for invalid N,
// 0 otherwise
int shift(list_t **head, int n) {
list_t *t1, *t2;
int i;
if ((head == NULL) || (*head == NULL))
return -1;
if (n <= 0)
return -2;
// move initial pointer ahead n steps
t1 = *head;
for (i = 0; i < n; i++) {
t1 = t1->next;
if (t1 == NULL) {
return -1;
}
}
t2 = *head;
// t2 and t1 are now N nodes away from each other.
// When t1 gets to the last node, t2 will point
// to the node previous to the last N nodes.
while (t1->next != NULL) {
t1 = t1->next;
t2 = t2->next;
}
// move the end nodes to the front of the list
t1->next = *head;
*head = t2->next;
t2->next = NULL;
return 0;
}