C++ 通过交换节点链接而不是交换值对链表进行递归选择排序-C++;

C++ 通过交换节点链接而不是交换值对链表进行递归选择排序-C++;,c++,recursion,linked-list,selection-sort,C++,Recursion,Linked List,Selection Sort,我试图为一个单链表递归地编写一个选择排序,当我想交换两个节点时遇到了问题。 以下是我的交换功能: void swapNode(ListNode** head_ref, ListNode* min, ListNode* prevMin, ListNode* head){ *head_ref = min; ListNode* temp = min->next; min->next = head->next; head->next = temp; pre

我试图为一个单链表递归地编写一个选择排序,当我想交换两个节点时遇到了问题。 以下是我的交换功能:

void swapNode(ListNode** head_ref, ListNode* min, ListNode* prevMin, ListNode* head){
  *head_ref = min;

  ListNode* temp = min->next;
  min->next = head->next;
  head->next = temp;

  prevMin->next = head;

}
然后它进入了一个无休止的循环。 当我将最后一行“prevMin->next=head;”更改为第二行时,如下所示:

void swapNode(ListNode** head_ref, ListNode* min, ListNode* prevMin, ListNode* head){
  *head_ref = min;
  prevMin->next = head;

  ListNode* temp = min->next;
  min->next = head->next;
  head->next = temp;

}
一切顺利。有人知道原因吗

下面是我的选择排序函数,在该函数中调用swapNode:

ListNode* selectionSortLL(ListNode* head){
  if(head == NULL || head->next == NULL) return head;
  ListNode* cur = head;
  ListNode* min = head, *prevMin = NULL;
  while(cur->next){
    if(cur->next->val < min->val){
      min = cur->next;
      prevMin = cur;
    }
    cur = cur->next;
  }

  if(min != head){
    swapNode(&head, min, prevMin, head);
  }

  head->next = selectionSortLL(head->next);
  return head;
}
ListNode*selectionSortLL(ListNode*head){
如果(head==NULL | | head->next==NULL)返回head;
ListNode*cur=头部;
ListNode*min=head,*prevMin=NULL;
while(cur->next){
如果(当前->下一步->值<最小->值){
最小=当前->下一步;
prevMin=cur;
}
cur=cur->next;
}
如果(最小!=头部){
swapNode(&head,min,prevMin,head);
}
头部->下一步=选择或全部(头部->下一步);
回流头;
}

使用节点框和链接箭头在纸上绘制所有内容。如果为初始(非工作)功能执行此操作,绘图是否有意义?对于树或列表之类的东西,通常先用钢笔和纸画东西,然后将你在纸上所做的操作转换成代码。特别是
swapNode
中的情况,其中
prevMin
head
看起来都很糟糕。