首页 > 解决方案 > 通过交换节点链接而不是交换值来对链表进行递归选择排序-C++

问题描述

我正在尝试以递归方式为单链表编写选择排序,当我想交换两个节点时遇到了麻烦。这是我的交换功能:

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;
}

标签: c++recursionlinked-listselection-sort

解决方案


推荐阅读