反转链表,并输出翻转后的链表

本文介绍了一种链表反转算法的实现方法,通过记录三个指针并改变其指向,完成链表的反转。文章提供了详细的C++代码实现,包括链表创建、反转及输出功能。

题目描述:

  输入一个链表,反转链表后,输出链表的所有元素。

算法思想:

  其实这个题目并不是很难,我们需要注意的就是在一些边界问题的处理上。使它的鲁棒性更好。我们只需记录三个指针,来改变三个指针的值去交换即可。

 

算法实现:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 typedef struct ListNode{
 6     int data;
 7     struct ListNode *next;
 8 }ListNode;
 9 
10 ListNode* ReverseList(ListNode *pHead){               //翻转链表
11     if(pHead == NULL){
12         return NULL;
13     }
14     
15     ListNode *PreNode = NULL;
16     ListNode *node = pHead;
17     ListNode *NewNode = NULL;
18     
19     while(node != NULL){
20         ListNode *pNext = node->next;
21         if(pNext == NULL){
22             NewNode = node;
23         }    
24         
25         node->next = PreNode;
26         PreNode = node;
27         node = pNext;
28     }
29     pHead->next = NULL;
30     return NewNode;
31 } 
32 
33 ListNode *CreateList(int x){                              //创建链表
34     long num;
35     ListNode *pHead = NULL;
36     ListNode *p = NULL;
37      
38     while(x-- > 0){
39             cin>>num;  
40             ListNode* pNew = new ListNode();  
41             if(pNew == NULL){
42                     exit(EXIT_FAILURE);
43                 }
44             pNew->data = num;  
45             pNew->next = NULL;  
46         
47             if(pHead == NULL)  
48             {  
49                 pHead = pNew;  
50                 p = pHead;  
51             }  
52             else
53             {  
54                 p->next = pNew;  
55                 p = p->next;  
56             }   
57         }
58     return pHead; 
59 } 
60 
61 void print(ListNode* pHead){             //输出翻转后的链表
62     if(pHead == NULL){
63         cout<<"NULL"<<endl;
64     }
65     else
66     {    
67         ListNode *p = pHead;
68         while(p != NULL){
69             cout<<p->data<<" ";
70             p = p->next;
71         }
72         cout<<endl;
73     }
74 }
75 
76 int main(){
77     int n;
78     ListNode *head = NULL;
79     ListNode *trail = NULL;
80     
81     while(cin>>n){
82         head = CreateList(n);
83         trail = ReverseList(head);
84         if(trail == NULL){
85             cout<<"NULL"<<endl;
86         }
87         else{
88             print(trail);
89         }
90     }
91     
92     return 0;
93 }

 

转载于:https://www.cnblogs.com/dormant/p/5332982.html

### 关于1025 反转链表算法实现解题思路 #### 题目描述解析 题目要求对于给定的一个单向链表,当参数 \( K \) 大于 1 的时候,按照每 \( K \) 个节点为一组的方式对链表中的节点进行分组,只对该组内的节点顺序做反转操作;而最后一组如果不足 \( K \) 个节点,则保持原有顺序不变[^1]。 #### 数据结构定义 针对此问题,在 C++ 或者其他支持面向对象编程的语言中通常会先定义一个 `ListNode` 类来链表中的每一个节点。该类至少应包含两个成员变量:一个是用于存储节点值的数据域 (`val`) ,另一个是指向前驱或者后继节点的指针域 (`next`) 。例如: ```cpp struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; ``` #### 主要逻辑分析 核心在于如何有效地遍历链表按指定长度分割成若干子序列来进行局部逆序排列。具体做法如下: - 使用额外的空间保存当前正在处理的一段链表头部位置以便后续连接; - 设置计数器控制每次迭代时读取固定数量\( K \)个元素形成待翻转区间; - 对上述区间的内部通过调整相邻两节点之间的指向关系完成反向链接过程; - 特殊情况考虑——剩余部分小于等于\( K−1 \),则不再执行任何改变直接附加到已修改好的新列末端即可。 #### 函数设计说明 考虑到实际应用场景可能涉及不同规模输入以及边界状况(比如空链表),因此建议编写辅助性的工具函数分别负责创建初始测试用例实例化对象、打印最终输出结果等功能模块。同时还需要注意内存管理方面的问题防止出现野指针错误造成程序崩溃异常退出等情况发生[^3]。 #### 示例代码片段展示 下面给出一段基于以上讨论所构思出来的解决方案示意性伪码供参考学习之用: ```cpp // 定义全局变量或适当作用域内声明 static const int MAXN = 1e5 + 7; // 节点最大容量预估 ListNode List[MAXN]; // 数组模拟静态分配空间代替动态申请new void Reverse(ListNode*& head, int k){ if (!head || !head->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值