链表翻转

2021-02-25  本文已影响0人  粑粑八成

要点

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


链表翻转示意图.png

区别

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

就地翻转

代码

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 + '\'' +
        '}';
  }
}
上一篇下一篇

猜你喜欢

热点阅读