剑指 Offer 24. 反转链表
程序员文章站
2022-03-01 17:21:56
...
1.题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。题目
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
2.思路
直接遍历链表的方法,采用原地反转的思路,直接将当前节点的next指向上一个节点,但是需要注意的是如果直接将当前节点的next的指向指向前一个节点,那么我们就丢失的后续的节点了,所以这里需要先用一个指针将当前节点的下一个节点保存下来。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//链表节点的数据结构
struct ListNode{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//链表反转
ListNode* reverseList(ListNode* head) {
ListNode *p=head;
ListNode *p_reverse_head=NULL;
ListNode *p_pre=NULL;
while(p!=NULL)
{
ListNode *p_next=p->next;//将当前节点的下一个节点保存下来。
if(p_next==NULL)//如果当前节点(尾节点)的后面为空,那么就将反转链表的头节点指向当前节点
{
p_reverse_head=p;
}
p->next=p_pre;//将当前节点的指向,指向上一个节点(进行反转)
p_pre=p;//将pre指向当前节点
p=p_next;//p指向了当前节点的下一个节点
}
return p_reverse_head;
}
//打印链表
void print_List(ListNode *head)
{
ListNode *p=head;
while(p!=NULL)
{
cout<<p->val<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
//构造链表的节点
ListNode *p1=new ListNode(1);
ListNode *p2=new ListNode(2);
ListNode *p3=new ListNode(3);
ListNode *p4=new ListNode(4);
ListNode *p5=new ListNode(5);
//将节点连接起来
ListNode *p=p1;
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=p5;
cout<<"反转前:"<<endl;
print_List(p);
ListNode *p_head=reverseList(p);
cout<<"反转后:"<<endl;
print_List(p_head);
}
上一篇: 关于HTTP缓存验证Last-Modified和Etag的使用
下一篇: C++ Pointers
推荐阅读
-
《剑指offer》面试题6 重建二叉树
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数)
-
剑指offer28:找出数组中超过一半的数字。
-
剑指offer27:按字典序打印出该字符串中字符的所有排列
-
C#版剑指Offer-001二维数组中的查找
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
剑指offer13:数组[奇数,偶数],奇数偶数相对位置不变。
-
剑指offer第二天
-
剑指offer JZ31 整数中1出现的次数 Python 解