链表反转

  1. 1. 单向链表反转
    1. 1.1 题目要求
    2. 1.2 思路分析
    3. 1.3 关键代码
  2. 2. 双向链表反转
    1. 2.1 关键代码

1. 单向链表反转

1.1 题目要求

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

示例1:

img

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

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

示例2:

img

输入:head = [1,2]
输出:[2,1]

示例3:

输入:head = []
输出:[]

1.2 思路分析

假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

1.3 关键代码

/**
 * 单向节点
 */
public class SinglyNode {
    public int val;

    /**
     * 下一个节点
     */
    public SinglyNode next;

    public SinglyNode(int val) {
        this.val = val;
    }

    public SinglyNode(int val, SinglyNode next) {
        this.val = val;
        this.next = next;
    }
}


/**
 * 单向链表反转
 * @param head 头节点
 * @return
 */
public static SinglyNode reverseSinglyList(SinglyNode head) {
    SinglyNode pre = null; // 当前节点的前一个节点,默认是null
    SinglyNode next = null; // 当前节点的下一个节点,默认是null

    while (head != null) {
        next = head.next; // 获取当前节点的下一个节点
        head.next = pre; // 当前节点的前一个节点变成当前的下一个节点(方向反转)

        pre = head; // 当前节点赋值给pre,指针后移
        head = next; // 指针移动到next节点,继续循环
    }
    return pre; // 最后头节点的引用
}

完整测试代码见: https://github.com/GeorgeChan95/algorithm/blob/master/src/main/java/com/george/reverseList/ReverseSingleList.java

2. 双向链表反转

2.1 关键代码

/**
 * 双向链表节点
 */
public class DoubleListNode {

    public int value;
    /**
     * 前一个节点
     */
    public DoubleListNode last;
    /**
     * 下一个节点
     */
    public DoubleListNode next;

    public DoubleListNode(int value) {
        this.value = value;
    }
}

/**
 * 双向链表反转
 * @param head 头节点
 * @return
 */
public static DoubleListNode reverseList(DoubleListNode head) {
    DoubleListNode last = null; // 前一个节点
    DoubleListNode next = null; // 下一个节点

    while (head != null) {
        next = head.next; // 获取当前节点的下一个节点

        head.next = last; // 前一个节点变成当前节点的下一个节点(链表方向反转)[原来头节点的last节点为空,反转后在链表末尾,next节点为空]
        head.last = next; // 下一个节点变成当前节点的前一个节点(方向反转)[原链表末尾节next节点为空,反转后变成头节点,last节点为空]

        last = head; // 当前节点变成前一个节点,指针后移
        head = next; // 指针指向下一个节点,进入下一轮循环.
    }
    return last; // 返回反转后的头节点的引用
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com