单向链表的插入排序 C++
Insertion Sort For A Singly Linked List C++
我得到了一个头文件,它定义了如何创建链表的节点
#ifndef _LISTNODE
#include <cstddef>
#define _LISTNODE
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
#endif
我的任务是创建一个函数,它将对链表进行插入排序并按降序对项目进行排序(可以假设链表中没有循环。
函数定义为
ListNode *insertionSortList(ListNode *head)
所以我现在的逻辑是遍历链表,直到发现迭代器当前所在的节点小于它旁边节点的值。在这种情况下,它采用包含较大数字的节点的值并将其存储在临时指针中。然后我的迭代器位于刚刚放入临时指针的节点之前的数字上,因此该节点现在指向打破顺序的节点并指向之后的节点。
然后我让另一个迭代器遍历列表,直到它找到使订单生效的位置,然后将正在存储的节点与临时指针一起放置,并在该节点内放置下一个指针到新迭代器发现小于它的节点。
如果这个解释有点乱,我很抱歉,但是当我画出图表时它似乎是有道理的,而且我没有看到我的代码在哪里可以打破这个逻辑,但是当我 运行 它与一些测试用例,它要么不排序,要么有时不排序并且不打印所有值。
#include <iostream>
#include "ListNode.h"
using namespace std;
ListNode *insertionSortList(ListNode *head)
{
ListNode *temp;
for (ListNode *iterator = head; iterator->next != NULL; iterator = iterator->next) //first iterator to find node that breaks the pattern
{
if (iterator->val >= iterator->next->val) // if it doesn't break the pattern
{
break;
}
else //if it does break the pattern
{
temp = iterator->next; //store pattern breaking node
iterator->next = iterator->next->next; //have linked list skip over this pattern breaking node
for (ListNode *replacementit = head; replacementit->next != NULL; replacementit = replacementit->next) // find place for patteern breaking node
{
if (replacementit->val < temp->val) //if found the right place
{
temp->next = replacementit; //put node into place
break;
}
}
}
}
return head;
}
int main() //test cases
{
ListNode A(5);
ListNode B(6);
ListNode C(10);
ListNode D(21);
ListNode E(25);
ListNode* head = &A;
A.next = &B;
B.next = &C;
C.next = &D;
D.next = &E;
insertionSortList(head);
for (ListNode *print = head; print->next != NULL; print = print->next) //print out sorted Linked List
{
cout << print->val << " ";
}
}
输出
5 10 %
您在 insertionSortList
函数的第一个 for
循环内的第一行的实现不正确。
例如 - 如果链表的第一个元素大于或等于链表的第二个元素,您的代码将不会在 for 循环中执行更多行,它将 "break"。您可以查看列表 2 -> 1 -> 3
.
另外,最后当你打印链表时,它总是不会打印最后一个元素,因为终止条件是错误的。
我得到了一个头文件,它定义了如何创建链表的节点
#ifndef _LISTNODE
#include <cstddef>
#define _LISTNODE
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
#endif
我的任务是创建一个函数,它将对链表进行插入排序并按降序对项目进行排序(可以假设链表中没有循环。
函数定义为
ListNode *insertionSortList(ListNode *head)
所以我现在的逻辑是遍历链表,直到发现迭代器当前所在的节点小于它旁边节点的值。在这种情况下,它采用包含较大数字的节点的值并将其存储在临时指针中。然后我的迭代器位于刚刚放入临时指针的节点之前的数字上,因此该节点现在指向打破顺序的节点并指向之后的节点。
然后我让另一个迭代器遍历列表,直到它找到使订单生效的位置,然后将正在存储的节点与临时指针一起放置,并在该节点内放置下一个指针到新迭代器发现小于它的节点。
如果这个解释有点乱,我很抱歉,但是当我画出图表时它似乎是有道理的,而且我没有看到我的代码在哪里可以打破这个逻辑,但是当我 运行 它与一些测试用例,它要么不排序,要么有时不排序并且不打印所有值。
#include <iostream>
#include "ListNode.h"
using namespace std;
ListNode *insertionSortList(ListNode *head)
{
ListNode *temp;
for (ListNode *iterator = head; iterator->next != NULL; iterator = iterator->next) //first iterator to find node that breaks the pattern
{
if (iterator->val >= iterator->next->val) // if it doesn't break the pattern
{
break;
}
else //if it does break the pattern
{
temp = iterator->next; //store pattern breaking node
iterator->next = iterator->next->next; //have linked list skip over this pattern breaking node
for (ListNode *replacementit = head; replacementit->next != NULL; replacementit = replacementit->next) // find place for patteern breaking node
{
if (replacementit->val < temp->val) //if found the right place
{
temp->next = replacementit; //put node into place
break;
}
}
}
}
return head;
}
int main() //test cases
{
ListNode A(5);
ListNode B(6);
ListNode C(10);
ListNode D(21);
ListNode E(25);
ListNode* head = &A;
A.next = &B;
B.next = &C;
C.next = &D;
D.next = &E;
insertionSortList(head);
for (ListNode *print = head; print->next != NULL; print = print->next) //print out sorted Linked List
{
cout << print->val << " ";
}
}
输出
5 10 %
您在 insertionSortList
函数的第一个 for
循环内的第一行的实现不正确。
例如 - 如果链表的第一个元素大于或等于链表的第二个元素,您的代码将不会在 for 循环中执行更多行,它将 "break"。您可以查看列表 2 -> 1 -> 3
.
另外,最后当你打印链表时,它总是不会打印最后一个元素,因为终止条件是错误的。