sdut2118数据结构实验之链表三:链表的逆置

本文介绍了一个使用C语言实现的链表反转程序。该程序首先创建一个单向链表,然后通过遍历并重新链接节点的方式完成链表的反转。文章包含完整的代码示例,有助于理解链表的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <malloc.h>
struct node
{
    int data;
    struct node *next;
};
int main()
{
    struct node *head,*p,*tail,*q,*r;
    head=(struct node*)malloc(sizeof(struct node));
    head->next=NULL;
    tail=head;
    while(1)
    {
        p=(struct node*)malloc(sizeof(struct node));
        scanf("%d",&p->data);
        if(p->data==-1)break;
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
    p=head->next;
    head->next=NULL;
    q=p->next;
    while(p)
    {
       p->next=head->next;
       head->next=p;
       p=q;
       if(q)
        q=q->next;
    }
    r=head;
    while(r->next!=NULL)
    {
        printf("%d ",r->next->data);
        r=r->next;
    }
    return 0;
}


/***************************************************
User name: TJRAC6015203228魏杰
Result: Accepted
Take time: 0ms
Take Memory: 104KB
Submit time: 2016-11-01 13:31:55
****************************************************/

### 山东科技大学PTA 数据结构 链表 练习题 解法 #### 关于链表的基础知识点 链表是一种常见的线性数据结构,其特点是通过指针连接节点形成序列。相比于数组,链表具有动态扩展的优势,在插入和删除操作上效率更高[^1]。 #### SDUT PTA 链表练习题分析 以下是几道典型的链表相关题目及其解法: --- #### 一元多项式加法与乘法 此题可以通过数组实现简单版本的解决方案,但由于未充分考虑负指数情况以及大规模数据处理需求,推荐使用单向链表作为主要存储方式。 下面是基于链表的一元多项式加法与乘法的核心逻辑: ```python class Node: def __init__(self, coef=0, expn=0, next=None): self.coef = coef # 系数 self.expn = expn # 指数 self.next = next def add_poly(p1, p2): head = cur = Node() # 创建虚拟头节点 while p1 and p2: if p1.expn > p2.expn: cur.next = Node(p1.coef, p1.expn) p1 = p1.next elif p1.expn < p2.expn: cur.next = Node(p2.coef, p2.expn) p2 = p2.next else: total_coef = p1.coef + p2.coef if total_coef != 0: cur.next = Node(total_coef, p1.expn) p1 = p1.next p2 = p2.next cur = cur.next cur.next = p1 or p2 return head.next def multiply_poly(p1, p2): dummy = Node() temp = dummy zero_node = Node(0, 0) while p2: prev = None curr = dummy p = p1 while p: coe = p.coef * p2.coef expo = p.expn + p2.expn node = Node(coe, expo) if not prev: prev = node curr.next = prev else: if prev.expn == expo: prev.coef += coe if prev.coef == 0: if prev == curr.next: curr.next = prev.next else: t = curr.next while t.next != prev: t = t.next t.next = prev.next del prev prev = t elif prev.expn < expo: node.next = prev if curr.next == prev: curr.next = node else: t = curr.next while t.next != prev: t = t.next t.next = node prev = node else: prev.next = node prev = node p = p.next p2 = p2.next return dummy.next if dummy.next != zero_node else None ``` 上述代码实现了链表形式的一元多项式的加法与乘法功能。 --- #### 单链表转 对于单链表问题,可以采用迭代方法完成反转过程。具体如下所示: ```c++ struct ListNode { int val; struct ListNode* next; }; ListNode* reverseList(ListNode* head) { ListNode* pre = nullptr; // 初始化前驱为空 ListNode* current = head; // 当前节点指向头部 while (current != nullptr) { // 循环直到当前节点为空 ListNode* tmpNext = current->next; // 记录下一个节点位 current->next = pre; // 修改当前节点的下一跳为前驱 pre = current; // 更新前驱到当前位 current = tmpNext; // 移动至原列表中的下一个节点 } return pre; // 返回新的头节点 } ``` 该函数能够有效翻转任意给定的单链表实例[^2]。 --- #### 带头结点的链式表操作集 带头结点的链表便于统一管理各种边界条件下的操作流程。例如创建、销毁、清空等功能均能更加简洁明了地编写出来。 下面展示如何构建这样一个支持基本CRUD行为的数据容器类定义模板(C++风格): ```cpp #include <iostream> using namespace std; template<typename T> class ListWithHeaderNode{ private: struct Node{ T data; Node* link; explicit Node(const T& d=T(), Node* n=nullptr):data(d),link(n){} }; public: typedef size_t SizeType; protected: Node* header;//header pointer public://constructors & destructor ListWithHeaderNode():header(new Node()){} ~ListWithHeaderNode(){ clear(); delete header;} public://accessor functions bool empty() const{return header->link==nullptr;} SizeType size()const; void traverse(void(*visit)(T&))const; public://mutator functions void insertAsFirst(const T&); void append(const T&); void remove(T&); void clear(); }; //...省略部分成员函数的具体实现... ``` 此类封装提供了灵活易用接口来操控内部维护的对象集合。 --- #### §相关问题§ 1. 如何优化一元多项式运算程序使其适应更大范围输入? 2. 是否存在其他高效算法用于解决单链表倒序排列任务? 3. 使用双端队列代替传统意义上的双向循环链表可行吗?为什么? 4. 如果需要频繁执行随机访问操作,选用哪种底层物理存储更适合——静态分配还是动态链接? 5. 设计一个自平衡二叉搜索树并讨论它相较于普通AVL Tree有哪些改进之处?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值