我查看了其他帖子,并没有为我的查询找到一个很好的解决方案。我不想对链接列表进行实际排序,我想查看它是否已排序。我在c ++中有一个链表问题。我被要求编写一个给定链表定义的函数,以查看它是否已排序。
实现函数isSorted - 如果链接列表中的值按递增顺序排序,则返回true。 (链表由整数组成)。
给出以下结果:
struct ListNode
{
double value; // The value in this node
struct ListNode *next; // To point to the next node
};
示例数据:从isSorted返回
1 - > 3 - > 7真实
4 - > 2 - > 7错误
()True //清空列表。
3真实
1→ 5 - > 7 - > 2错误
我有类似的东西。
bool NumberList::isSorted() const
{
ListNode *nodePtr; // To move through the list
nodePtr = head;
while (nodePtr)
{
if(nodePtr->value <= nodePtr->value+1)
nodePtr = nodePtr->next;
else
return false;
return true;
}
}
我不确定我是否正确行事,我需要帮助。 谢谢。
答案 0 :(得分:2)
也许这会奏效......
bool NumberList::isSorted() const
{
ListNode *nodePtr;
nodePtr = head;
double d;
if (!nodePtr) return true; // Empty list
// Save value of current node
d = nodePtr->value;
// Point to next node
nodePtr = nodePtr->next;
while (nodePtr)
{
if(d > nodePtr->value) return false; // Not sorted
// Save value of current node
d = nodePtr->value;
// Point to next node
nodePtr = nodePtr->next;
}
return true;
}
答案 1 :(得分:1)
如果列表按升序排序,那么对于比较功能,您使用每个节点的值大于或等于前一个节点。即价值永远不会减少。只需遍历节点并检查它。
注意:您显示的条件
nodePtr->value <= nodePtr->value+1
不会检查任何合理的内容:它会检查某个值是否小于或等于该值加1。
更合理条件的一个想法是将nodePtr->value
与前一个节点的值进行比较。要轻松完成此操作,您需要在上一次迭代中存储前一个节点的值(或指向前一个节点的指针)。在一些变量中。
答案 2 :(得分:0)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node* next;
};
void insert(struct node* p,int x)
{
struct node* q=new node;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
q->data=x;
q->next=0;
}
void printlist(struct node* p)
{
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
bool ifsorted(struct node* p)
{
while(p->next!=NULL)
{
if(p->data>p->next->data)
return false;
p=p->next;
}
return true;
}
int main()
{
struct node* head=new node;
struct node* second=new node;
struct node* third=new node;
head->data=1;
head->next=second;
second->data=2;
second->next=third;
third->data=3;
third->next=NULL;
insert(head,4);
insert(head,56);
insert(head,100);
printlist(head);
ifsorted(head)?cout<<"Sorted":cout<<"Not sorted";
}