面试算法24:反转链表

题目

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。例如,把图4.8(a)中的链表反转之后得到的链表如图4.8(b)所示。

分析

由于节点j的next指针指向了它的前一个节点i,因此链表在节点j和k之间断开,无法在链表中遍历到节点k。为了避免链表断开,需要在调整节点j的next指针之前把节点k保存下来。

也就是说,在调整节点j的next指针时,除了需要知道节点j本身,还需要知道节点j的前一个节点i,这是因为需要把节点j的next指针指向节点i。同时,还需要事先保存节点j的下一个节点k,以防止链表断开。因此,在遍历链表逐个反转每个节点的next指针时需要用到3个指针,分别指向当前遍历到的节点、它的前一个节点及后一个节点。

解

java 复制代码
public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        ListNode listNode7 = new ListNode(7);
        ListNode listNode8 = new ListNode(8);

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;

        ListNode result = reverseList(listNode1);
        while (result != null) {
            System.out.println(result.val);
            result = result.next;
        }
    }

    public static ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }

        return prev;
    }
}
相关推荐
All for pursuit.14 分钟前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
小师兄吃牛肉1 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
一只小小的芙厨2 小时前
【线性DP】
学习·算法·动态规划
奋发向前wcx3 小时前
CSP-J复赛模拟赛5 王晨旭补题 2026.10.5
算法
罗湖老棍子4 小时前
C Looooops(信息学奥赛一本通- P1640)
算法·数论·同余·裴蜀定理·扩展欧几里得
Interview Aid1126 小时前
OpenAI SWE 面试流程
面试·职场和发展
飘尘7 小时前
SVG和Canvas,前端里的两支“画笔”,用的时候怎么选择?
前端·javascript·面试
飘尘7 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
ShineWinsu7 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
夏幻灵7 小时前
每日一题:LeetCode 3:无重复字符的最长子串——滑动窗口思路详解
算法·leetcode·职场和发展