链表OJ之 反转单链表

简介: 链表OJ之 反转单链表

请看题目:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:

输入:head = [1, 2, 3, 4, 5]

输出:[5, 4, 3, 2, 1]

示例2:

输入:head = [1, 2]

输出:[2, 1]

示例3:

输入:head = [ ]

输出:[ ]



解题:


思路一:取结点头插

大体思路就是用 cur 遍历一遍链表,cur 前后各有 next 和 newhead ,通过改变 cur 的下一个结点实现链表的反转。

4a9b828919b961d11b9e324eca3ade99_711fbfb8a5fc438a8185d7fac19e5fdc.png

a25c6fc918093122c8b6b13c639cb6b0_58164acb931e47218f4c07b55e98be81.png

我是图示

代码实现:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*cur = head;
    struct ListNode*newhead = NULL;
    while(cur)
    {
        //更新头
        struct ListNode*next = cur->next;
        cur->next = newhead;
        //前进
        newhead = cur;
        cur = next;
    }
    return newhead;
}


思路二:三指针反转法


与思路一类似,创建三个指针 n1, n2 ,n3 ,通过改变 n2 的下一个结点改变链表的方向。

image.png

我是图示

代码实现:

struct ListNode* reverseList(struct ListNode* head){
    //排除三个结点以下的情况
    if(head == NULL||head->next == NULL)
    {
        return head;
    }
    //确定位置
    struct ListNode* n1,*n2,*n3;
    n1 = head;
    n2 = n1->next;
    n3 = n2->next;
    n1->next = NULL;
    //中间结点不为空,继续修改指向
    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }
    return n1;
}

总结:

这篇博客为反转链表提供了两种解决方案,都属于迭代类型,你学会了吗?

目录
相关文章
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
25 7
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
4月前
【数据结构OJ题】环形链表
力扣题目——环形链表
37 3
【数据结构OJ题】环形链表
|
4月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
51 1
【数据结构OJ题】复制带随机指针的链表
|
4月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
30 1
【数据结构OJ题】环形链表II
|
4月前
【数据结构OJ题】相交链表
力扣题目——相交链表
32 1
【数据结构OJ题】相交链表
|
4月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
41 8
【数据结构OJ题】合并两个有序链表
|
4月前
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
43 2
【数据结构OJ题】移除链表元素
|
4月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
36 1
【数据结构OJ题】链表中倒数第k个结点
|
4月前
【数据结构OJ题】链表分割
牛客题目——链表分割
32 0
【数据结构OJ题】链表分割