Связанный список: перемещение узла из одного списка в другой

Есть 2 списка source={3,2,1} и dest ={4,5,6,7} где указатель заголовка связанных списков есть в 3 и 4 соответственно. головной узел из источника удаляется, а данные 3 перемещаются в список dest, и он делается как новый головной узел в списке dest.

Итак, после первого раунда source ={2,1} dest ={3,4,5,6,7} где голова в источнике указывает на 2 сейчас, а head в dest указывает на 3. Наконец, мне нужно сделать source = NULL and Dest = {1,2,3,4,5,6,7} head => 1 . Я могу это сделать, каждый раз вызывая функцию узла перемещения. Но когда я бегу в цикле, он продолжает цикл. Вот ошибочный код. Пожалуйста, скажите мне, почему существует проблема с циклом.

  typedef struct node{ int data; struct node* next; }Node; void push(Node** headRef, int data){ Node* newNode = (Node*) malloc(sizeof(newNode)); newNode->data = data; newNode->next = *headRef; *headRef = newNode; } Node* pushtop(){ Node* head = NULL; int i; for(i = 1; i=4; i--){ push(&head,i); } return head; } void moveNode(Node** source,Node** dest){ Node* ptr = *source; Node* current = NULL; while(ptr!=NULL){ // here the continuous looping occurs current=ptr; current->next = *dest *dest = current; *source = ptr->next; ptr = ptr->next; } Node* test = *dest; printf("\nthe then moved list is\n\n"); while(test!=NULL){ printf("%d\n",test->data); test = test->next; } } int main(){ Node* headA = pushtop(); Node* headB = pushbottom(); moveNode(&headA, &headB); return 0; } в  typedef struct node{ int data; struct node* next; }Node; void push(Node** headRef, int data){ Node* newNode = (Node*) malloc(sizeof(newNode)); newNode->data = data; newNode->next = *headRef; *headRef = newNode; } Node* pushtop(){ Node* head = NULL; int i; for(i = 1; i=4; i--){ push(&head,i); } return head; } void moveNode(Node** source,Node** dest){ Node* ptr = *source; Node* current = NULL; while(ptr!=NULL){ // here the continuous looping occurs current=ptr; current->next = *dest *dest = current; *source = ptr->next; ptr = ptr->next; } Node* test = *dest; printf("\nthe then moved list is\n\n"); while(test!=NULL){ printf("%d\n",test->data); test = test->next; } } int main(){ Node* headA = pushtop(); Node* headB = pushbottom(); moveNode(&headA, &headB); return 0; } 

пожалуйста, проверьте Move node While loop part.

 Node* ptr = NULL; Node* current = *source; while(current != NULL) { // here the continuous looping occurs ptr = current->next; current->next = dest; dest = current; current = ptr; } 

Ответ немного отличается от ответа @ zavg. немного тонкая настройка сделала его работу.

Как я уже сказал, исходный указатель также должен быть изменен. поэтому я вставлю код. Спасибо @zavg за помощь.

  while(ptr != NULL) { // here is the correct code. current = ptr->next; ptr->next = *dest; *dest = ptr; ptr = current; *source = ptr; } printf("%p\n",*source); //it will print Nil. Node* test = *dest; printf("\nthe then moved list is\n\n"); while(test!=NULL){ printf("%d\n",test->data); test = test->next; } в  while(ptr != NULL) { // here is the correct code. current = ptr->next; ptr->next = *dest; *dest = ptr; ptr = current; *source = ptr; } printf("%p\n",*source); //it will print Nil. Node* test = *dest; printf("\nthe then moved list is\n\n"); while(test!=NULL){ printf("%d\n",test->data); test = test->next; }