美文网首页
链表翻转

链表翻转

作者: 粑粑八成 | 来源:发表于2021-02-25 22:16 被阅读0次

要点

分为两种方式,分别是头插法和就地翻转


链表翻转示意图.png

区别

  • 头插法两个指针随着遍历往后,而且声明一个新的头
  • 就地反转头用已存在的,一个指针随着遍历往后,另一个指针不变始终指向第一个(即翻转后的最后一个),但是该节点会随着遍历往后移(即变的是改节点而非指针)

头插法(声明新链表,把原先的逐个加到新的里面)

  • 声明一个空的头,声明两个指针,三个变量
  • 变量1指向要插入的节点
  • 变量2指向下一个节点,防止变量1指向的节点插入时断链
  • 随着遍历(即在循环中),两个指针往后移动

就地翻转

  • 新声明两个变量,头用原来的,一共三个变量
  • 变量1指向头结点,用来指向第一个变量,也即反转后的最后一个元素,随着遍历不变(即在循环中不变),变的是节点相对位置而非该指针变量
  • 变量2指向头结点下一个节点,随着遍历指针往后走,判空条件为该变量为空
  • 过出来的节点也是用头插法的思想在头上插入

代码

public class SimpleLinkList {

  public static void main(String[] args) {
    Node node1 = new Node(1, "first");
    Node node2 = new Node(2, "second");
    Node node3 = new Node(3, "third");

    LinkList list = new LinkList();
    list.addByNo(node1);
    list.addByNo(node3);
    list.addByNo(node2);

    list.show();

    list.reverse();
    list.show();

    LinkList newHeader = list.reverseByInsert();
    newHeader.show();
  }

}

class LinkList {

  public Node header = new Node(0, "header");

  public LinkList() {

  }

  public LinkList(Node header) {
    this.header = header;
  }

  // 头插法
  public LinkList reverseByInsert() {
    Node newHeader = new Node(0, "header");
    Node current = header.next;
    Node temp;
    while (current != null) {
      temp = current.next;
      current.next = newHeader.next;
      newHeader.next = current;
      current = temp;
    }
    return new LinkList(newHeader);
  }

  // 就地翻转
  public Node reverse() {
    Node current = header.next;
    Node temp = current.next;
    while (temp != null) {
      current.next = temp.next;
      temp.next = header.next;
      header.next = temp;
      temp = current.next;
    }
    return header;
  }

  ;

  public void addNode(Node node) {
    Node temp = header;
    while (temp.next != null) {
      temp = temp.next;
    }
    temp.setNext(node);
  }

  public void addByNo(Node node) {
    Node temp = header;
    while (temp.next != null && temp.next.no < node.no) {
      temp = temp.next;
    }

    node.setNext(temp.next);
    temp.setNext(node);
  }

  public void show() {
    Node temp = header;
    while (temp.next != null) {
      temp = temp.next;
      System.out.println(temp);
    }
  }
}

class Node {

  public int no;
  private String name;
  public Node next;

  public Node(int no, String name) {
    this.no = no;
    this.name = name;
  }

  public void setNext(Node next) {
    this.next = next;
  }

  @Override
  public String toString() {
    return "Node{" +
        "no=" + no +
        ", name='" + name + '\'' +
        '}';
  }
}

相关文章

  • 翻转链表

    翻转链表 描述翻转一个链表 样例给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->nul...

  • 25. K 个一组翻转链表

    K个一组反转链表 翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • 链表翻转

    给定单向链表,返回翻转后的链表

  • 链表

    1.翻转链表链表的定义 翻转 快慢指针找链表 的中间位置 3.有序链表的合并 4.判断链表中是否有环解法1: 借助...

  • Swift - LeetCode - 翻转链表

    题目 翻转链表 问题: 翻转链表中第m个节点到第n个节点的部分 说明: m,n满足1 ≤ m ≤ n ≤ 链表长度...

  • K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • leetcode第九十二题—反转链表 II

    又是一道升级题,还记得原来的翻转链表嘛,这个是要求指定m和n翻转链表。或许你忘了链表翻转怎么做,我编一个口诀:要问...

  • 【LeetCode】25.K个一组翻转链表

    题目描述 25.K个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数...

  • 翻转单链表

    翻转单链表 方法一:将单链表头插到一个新链表中 浪费空间,不过简单 方法二:使用三个指针遍历单链表,逐个点进行翻转...

  • 【Leetcode】【链表】025-Reverse Nodes

    k个一组翻转链表 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于...

网友评论

      本文标题:链表翻转

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