单向链表反转

2020-03-04  本文已影响0人  冉桓彬

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

遍历
public class Node {
    public int value;
    public Node nextNode;
}

public Node reverse(Node head) {
    if (head == null || head.next == null) {
        return head;
    }
    Node pre = head;
    Node cur = head.next;
    Node next = null;
    while (cur != null) {
        // 1. 当前节点的前置节点赋值给当前节点的后置节点
        cur.nextNode = pre;
        // 2. cur、pre、next分别向后移动一位, next起到占位的作用;
        next = cur.nextNode;
        pre = cur;
        // 3. 占位节点next每次循环结束以后, 赋值给cur用于下一次循环的起始节点
        cur = next;
    }
    // 遍历结束, 释放head的引用
    head.nextNode = null;
    head = pre;
}
递归
public class Node {
    public int value;
    public Node nextNode;
}

public Node reverse(Node curNode) {
    // 1.递归的出口
    if (curNode == null || curNode.nextNode == null) {
        return curNode;
    }
    // 2. 当前curNode不是尾节点, 也不是倒数第二个节点
    Node nextNode = curNode.nextNode;
    // 3. 节点反转, 需要将当前节点的后置节点置为null
    curNode.nextNode = null;
    // 4. 递归调用, 此时应该返回nextNode的后置节点
    Node reverseNode = reverse(nextNode);
    nextNode.nextNode = curNode;
    return reverseNode;
}
上一篇下一篇

猜你喜欢

热点阅读