美文网首页
链表反转

链表反转

作者: 康俊1024 | 来源:发表于2019-06-04 20:45 被阅读0次

概述

链表反转是非常经典的面试题,要实现此功能,需先实现链表的数据结构。

链表类

public class Node<K,V> {
    private final K key;
    private V value;
    private Node<K, V> next;

    public Node(K key, V value, Node<K, V> next) {
        this.key = key;
        this.value = value;
        this.next = next;
    }
}

获得单向链表方法

    /**
     * 头插法生成的单向链表--后来的在链表头部
     */
    public static Node<Integer, Integer> getOneWayLinkedList(int length) {
        Node<Integer, Integer> temp = null;
        for (int i = 1; i <= length; i++) {
            //头插法:先来的在链尾
            temp = new Node<>(i, i, temp); 
        }
        return temp;   //8 -> 1 -> null
    }

输出单向链表方法

    /**
     * @param linkedList 单向链表,从链表头的位置开始。 8 -> 1
     */
    public static void forLinkedList(Node<Integer, Integer> linkedList) {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        while (linkedList != null) {
            sb.append("[k:").append(linkedList.getKey()).append(" v:").append(linkedList.getValue()).append("]");
            linkedList = linkedList.getNext();
        }
        sb.append("}");
        System.out.println(sb.toString());
    }

逆序单链表

  • First Blood 引入中间变量节点
public static Node<Integer, Integer> reverse1(Node<Integer, Integer> head) {
        //反转之后链表
        Node<Integer, Integer> reverse = null;
        //原链表
        Node<Integer, Integer> current = head;
        while (current != null) {
            Node<Integer, Integer> temp = current;
            current = current.getNext();
            temp.setNext(reverse);
            reverse = temp;
        }
        return reverse;   //1 -> 8 -> null
}
  • Double kill 递归
public static Node<Integer, Integer> reverse2(Node<Integer, Integer> head) {
        //当为空或者本节点为末尾节点的时候
        if (head == null || head.getNext() == null) {
            return head;
        }
        Node<Integer, Integer> reversedHead = reverse2(head.getNext());
        //获取先前的下一个节点,让该节点指向自身     //8 -> 1 -> null
        head.getNext().setNext(head);
        //破坏以前自己指向下一个节点
        head.setNext(null);
        //层层传递给最上面的
        return reversedHead;
}

相关文章

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 链表反转

    循环反转链表 递归反转链表

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • JZ-015-反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。题目链接: 反转链表[https://www.no...

  • 算法学习(链表相关问题)

    LeetCode 206 反转链表 LeetCode 92 反转链表II (练习) 完成,方法:在反转链表上改 L...

  • 实战高频leetcode题目

    1. 反转链表 : 反转链表是常见简单题目,定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点...

  • 【教3妹学算法】2道链表类题目

    题目1:反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head ...

  • leecode刷题(22)-- 反转链表

    leecode刷题(22)-- 反转链表 反转数组 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你...

  • 链表简单算法相关练习

    单链表反转: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 迭代方式实现: 复杂度分析: 时...

  • iOS之【链表】

    构建链表 链表反转

网友评论

      本文标题:链表反转

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