反转双链表

简介: 反转双链表
package com.harrison.class02;
import java.util.ArrayList;
import java.util.List;
public class Code02_ReverseDoubleList {
  public static class DoubleNode{
    public int value;
    public DoubleNode last;
    public DoubleNode next;
    public DoubleNode(int v) {
      this.value=v;
    }
  }
  public static DoubleNode reverseDoubleList(DoubleNode head) {
    DoubleNode pre=null;
    DoubleNode next=null;
    while(head!=null) {
      next=head.next;
      head.next=pre;
      head.last=next;
      pre=head;
      head=next;
    }
    return pre;
  }
  public static DoubleNode generateRandomDoubleList(int len,int value) {
    int size=(int)(Math.random()*(len+1));
    if(size==0) {
      return null;
    }
    size--;
    DoubleNode head=new DoubleNode((int)(Math.random()*(value+1)));
    DoubleNode pre=head;
    while(size!=0) {
      DoubleNode cur=new DoubleNode((int)(Math.random()*(value+1)));
      pre.next=cur;
      cur.last=pre;
      pre=cur;
      size--;
    }
    return head;
  }
  public static List<Integer> getDoubleListOriginOrder(DoubleNode head) {
    List<Integer> ans=new ArrayList<>();
    while(head!=null) {
      ans.add(head.value);
      head=head.next;
    }
    return ans;
  }
  public static boolean checkedLinkListReverse(List<Integer> origin,DoubleNode head) {
    DoubleNode end=null;
    for(int i=origin.size()-1; i>=0; i--) {
      if(!origin.get(i).equals(head.value)) {
        return false;
      }
      end=head;
      head=head.next;
    }
    for(int i=0; i<origin.size(); i++) {
      if(!origin.get(i).equals(end.value)) {
        return false;
      }
      end=end.last;
    }
    return true;
  }
  public static DoubleNode testReverseDoubleList(DoubleNode head) {
    if(head==null) {
      return null;
    }
    ArrayList<DoubleNode> list=new ArrayList<>();
    while(head!=null) {
      list.add(head);
      head=head.next;
    }
    list.get(0).next=null;
    DoubleNode pre=list.get(0);
    int N=list.size();
    for(int i=1; i<N; i++) {
      DoubleNode cur=list.get(i);
      cur.last=null;
      cur.next=pre;
      pre.last=cur;
      pre=cur;
    }
    return list.get(N-1);
  }
  public static void main(String[] args) {
    int testTimes=1000000;
    int len=100;
    int value=100;
    System.out.println("test begin");
    for(int i=0; i<testTimes; i++) {
      DoubleNode node1=generateRandomDoubleList(len, value);
      List<Integer> list1=getDoubleListOriginOrder(node1);
      node1=reverseDoubleList(node1);
      if(!checkedLinkListReverse(list1, node1)) {
        System.out.println("Oops");
      }
      DoubleNode node2=generateRandomDoubleList(len, value);
      List<Integer> list2=getDoubleListOriginOrder(node2);
      node2=testReverseDoubleList(node2);
      if(!checkedLinkListReverse(list2, node2)) {
        System.out.println("Oops");
      }
    }
    System.out.println("finish");
  }
}
相关文章
|
索引
【链表OJ】相交链表 环形链表1
【链表OJ】相交链表 环形链表1
|
6月前
|
C语言 C++ 索引
【力扣】141. 环形链表、160. 相交链表、206.反转链表、234. 回文链表
【力扣】141. 环形链表、160. 相交链表、206.反转链表、234. 回文链表
【链表】160. 相交链表
【链表】160. 相交链表
|
6月前
|
算法 程序员
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
【算法训练-链表 三】【特殊链表】环形链表、环形链表II、回文链表、相交链表
54 0
|
存储
【链表OJ】链表中倒数第k个结点 合并两个链表(含哨兵位) 分割链表 链表的回文结构
【链表OJ】链表中倒数第k个结点 合并两个链表(含哨兵位) 分割链表 链表的回文结构
|
存储
利用快慢指针,求链表的中间结点,判断链表是否是环形链表
利用快慢指针,求链表的中间结点,判断链表是否是环形链表
56 0
|
算法 C语言
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
85 0
1.移除链表元素 2.反转链表 3.链表的中间结点
1.移除链表元素 2.反转链表 3.链表的中间结点
68 0
【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #
【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #