美文网首页
反转单向链表

反转单向链表

作者: 灰气球 | 来源:发表于2021-08-10 12:15 被阅读0次

1. 要求

转换前 : 1 -> 2 -> 3 -> 4 -> 5
转换后 : 5 -> 4 -> 3 -> 2 -> 1
转换前 : null
转换后 : null
转换前 : 5
转换后 : 5

2. 链表结构

@Data
@AllArgsConstructor
@NoArgsConstructor
static class Node {

    private int id;
    private Node next;

    public Node(int id) {
        this.id = id;
    }
}

3. 实现方式

循环、迭代

3.1 循环

/**
 * 反转链表,实现方式:循环
 *
 * @param head 链表头部
 * @return 新的链表头部
 */
public static Node reversalByCirculation(Node head) {
    if (head == null || head.next == null) {
        return head;
    }
    Node current = head;
    Node pre = null;
    while (current.next != null) {
        Node next = current.next;
        current.next = pre;
        pre = current;
        current = next;
    }
    current.next = pre;
    return current;
}
@Test
public void testReversalByCirculation() {
    Node node1 = new Node(1);
    Node node2 = new Node(2);
    Node node3 = new Node(3);
    Node node4 = new Node(4);
    node1.next = node2;
    node2.next = node3;
    node3.next = node4;
    originalHead = node1;
    Node current = reversalByCirculation(node1);
    while (current != null) {
        System.out.printf("%s ", current.id);
        current = current.next;
    }
}

3.2 迭代

private static Node originalTail;
private static Node originalHead;

/**
 * 反转链表,实现方式:迭代
 * <p>
 * originalHead:原来的链表头部 == 新的尾巴
 * originalTail:原来的链表尾巴 == 新的头部
 *
 * @param node 链表头部
 * @return 新的链表尾巴
 */
public static Node reversalByRecursion(Node node) {
    if (node == null || node.next == null) {
        originalTail = node;
        return node;
    }
    Node tail = reversalByRecursion(node.next);
    tail.next = node;
    if (node == originalHead) {
        node.next = null;
    }
    return node;
}
@Test
public void testReversalByRecursion() {
    Node node1 = new Node(1);
    Node node2 = new Node(2);
    Node node3 = new Node(3);
    Node node4 = new Node(4);
    node1.next = node2;
    node2.next = node3;
    node3.next = node4;
    originalHead = node1;
    Node newTail = reversalByRecursion(node1);
    Node current = originalTail;
    while (current != null) {
        System.out.printf("%s ", current.id);
        current = current.next;
    }
}

相关文章

  • 数据结构 - 单向链表及相关算法

    单向链表 链表常见算法 链表反转

  • reverse linked list

    反转单向链表 demo 运行效果

  • 数据结构专题:1.单向链表反转与排序

    有如下单向链表 1.单向链表反转,递归 递归的方式其实是从尾节点开始进行指针反转,最终递归反转到头节点 2.单向链...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 数据结构-链表

    相关掌握点 单向链表 双向链表 反转单向链表 判断链表是否含有环 链表构建 链表是一种线性结构,是通过指针引用节点...

  • 单向链表-链表反转

    最近在并行复习数据结构与算法的知识,为了加强掌握,就把做题思路用画图的方式记录下来。今天是第一篇,常见的问题:链表...

  • 链表 - 单向链表反转

    反转一个单链表。输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL 图解...

  • 链表常见问题

    反转单向链表思路使用一个临时节点当做缓冲节点,通过绕圈完成反转 反转部分链表题:给定一个链表,及反转的范围,完成反...

  • 单向链表反转

    https://blog.csdn.net/blioo/article/details/62050967

  • 反转单向链表

    单向链表的反转是一个非常常见的链表类面试题,我在刷leetcode的过程中,发现了有许多链表题目的解法,都是以反转...

网友评论

      本文标题:反转单向链表

      本文链接:https://www.haomeiwen.com/subject/ffvxbltx.html