构造有序的单链表

描述
构造有序(升序)的单链表并实现单链表的逆置(可以采用结构化的程序设计方法实现,即不必定义类)

输入
输入链表中的数据。(用0表示输入的结束,0不能添加到链表中)
输出
按顺序输出有序链表中的数据
样例输入
4 1 6 8 2 0
样例输出
1 2 4 6 8
8 6 4 2 1

解题思想:
单链表的生成,做的时候有点偷懒了,本来应该生成单链表的时候就应该完成为升序的插入(也就是先插入一个数,然后后面的小的就插前面,大的就往后面插;结果我只是先将数据排序,然后再顺序插;)。
实质:单链表的构成,及基本操作。

#include <iostream>
#include <algorithm>
#define max 1000
using namespace std;
struct node
{
    int data;
    node *next;
};
class list
{
    node *first;
public:
    list();
    list(int a[],int n,int f);
    ~list();
    void printlist();
};
list::list()
{
    first=new node;
    first->next=nullptr;
}
list::list(int a[],int n,int f)
{
    if(f==1){
    first=new node;
    first->next=nullptr;
    for(int i=0;i<n;i++)
        {
            node *s=nullptr;
            s=new node;
            s->data=a[i];
            s->next=first->next;
            first->next=s;
        }
        }
    else{
        first=new node;
        node *r=first,*s=nullptr;
        for(int i=0;i<n;i++)
            {
                s=new node;
                s->data=a[i];
                r->next=s;
                r=s;
            }
        r->next=nullptr;
    }
}
list::~list()
{
    node *p=first;
    while(first->next!=nullptr){
        first=first->next;
        delete p;
        p=first;
    }
}
void list::printlist()
{
    node *p=first->next;
    while(p!=nullptr)
        {
            cout<<p->data<<" ";
            p=p->next;
        }
    cout<<endl;
}
int main()
{
    int b,count=0;
    int s1[max];
    while(cin>>b&&b!=0)
        {
            s1[count]=b;
            count++;
        }
    sort(s1,s1+count);
    list two{s1,count,0};
    two.printlist();
    two.~list();
    list one{s1,count,1};
    one.printlist();
    one.~list();
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有两个有序链表 A 和 B,我们需要将它们合并成一个有序链表 C。具体的步骤如下: 1. 创建一个新的空链表 C。 2. 分别从链表 A 和 B 的头部开始遍历,比较两个节点的值的大小,将较小的那个节点加入链表 C 中,并将指针后移。 3. 如果链表 A 或 B 中有一个遍历到了结尾,则将另外一个链表的剩余节点全部加入链表 C 中。 4. 遍历结束后,链表 C 就是合并后的有序链表。 下面是 Python 代码实现: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode: dummy = ListNode(0) cur = dummy while l1 and l2: if l1.val < l2.val: cur.next = l1 l1 = l1.next else: cur.next = l2 l2 = l2.next cur = cur.next cur.next = l1 if l1 else l2 return dummy.next ``` 其中,ListNode 表示链表中的一个节点,val 表示节点的值,next 表示指向下一个节点的指针。mergeTwoLists 函数接受两个参数 l1 和 l2,分别表示两个有序链表的头节点,返回合并后的有序链表的头节点。dummy 表示合并后的有序链表的虚拟头节点,cur 表示当前节点的指针。在遍历两个链表的过程中,不断比较两个节点的值的大小,将较小的那个节点加入链表 C 中,并将指针后移。最后,如果链表 A 或 B 中有一个遍历到了结尾,则将另外一个链表的剩余节点全部加入链表 C 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值