剑指Offer - 面试题24:反转链表

简介: 剑指Offer - 面试题24:反转链表

题目

定义一个函数,输入一个链表的头就额点,反转该链表并输出反转后链表的头节点。链表节点定义如下:


typedef int TElemType;//链表节点值的数据类型
struct ListNode
{
    TElemType Data;
    ListNode* Next;
};


分析

反转链表需要用到三个指针。later指针和node指针用于转方向,front指针用于记录下一个节点位置。

反转核心四步如下图

C++

#include <iostream>
using namespace std;
typedef int TElemType;//链表节点值的数据类型
struct ListNode
{
    TElemType Data;
    ListNode* Next;
};
void CreateList(ListNode** head)//构造链表
{
    ListNode* p = nullptr;
    ListNode* q = nullptr;
    int val = 1;
    *head = new ListNode();
    (*head)->Data = val++;
    q = *head;
    while (val < 7)
    {
        p = new ListNode();
        p->Next = nullptr;
        p->Data = val++;
        q->Next = p;
        q = p;
    }
}
void PrintList(ListNode* head) //输出
{
    while (head != nullptr)
    {
        cout << head->Data;
        if (head->Next != nullptr)
        {
            cout << "->";
        }
        else
        {
            cout << endl;
        }
        head = head->Next;
    }
}
ListNode* ReversList(ListNode* pHead)
{
    //传入空指针或者只有一个节点,就返回本身
    if (nullptr == pHead || nullptr == pHead->Next)
    {
        return pHead;
    }
    ListNode* later = nullptr;//后指针
    ListNode* node = pHead;//当前节点指针
    ListNode* front = pHead;//前指针
    while (node != nullptr)
    {
        front = front->Next;
        node->Next = later;
        later = node;
        node = front;
    }
    return later;
}
int main()
{
    ListNode* head = nullptr;
    CreateList(&head);
    cout << "链表反转前:";
    PrintList(head);
    ListNode* Newhead = ReversList(head);
    cout << "链表反转后:";
    PrintList(Newhead);
    return 0;
}


本章完!

目录
相关文章
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
2月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
58 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
4月前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
36 0
|
4月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
4月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
6月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
7月前
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
|
7月前
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列