单链表的反转

190 阅读1分钟
class LInkedList {
    public static void main(String[] args) {
      首先创建节点
      HeroNode hero1=new HeroNode(1);
      HeroNode hero2=new HeroNode(2);
      HeroNode hero3=new HeroNode(3);
      创建链表
      singleLinkList.add(hero1);     
      singleLinkList.add(hero2);
      singleLinkList.add(hero3);
      进行反转
      reverseList(singleLinkList.getHead());
    }

定义链表的结点类

static class HerNode{
   **
     datadata域
     next为HerNode的尾部next域,指向下一个节点  
   **
   public int data; 
   public HerNode next;
   **
      构造器
   **
   public HeroNode(int data){
      this.data;
  }
}

创建链表

static class SingleLinkList{
    先初始化一个头节点,头节点不要动,不存放具体的数据
    private static HeroNode head=new HeroNode(0);

在列表中添加数据的方法

public void add(HeroNode heroNode){
    因为头节点不能动,因此我们需要一个辅助遍历指针temp
    HeroNode temp=head;
    遍历链表,找到最后
    while(true){
        if (temp.next == null) {
            break;
        }
        如果没有找到最后,将temp后移
        temp=temp.next;
    }
    当退出while循环时,temp就指向了链表的最后
    将最后这个节点的next指向新的节点
    temp.next=heroNode;
 }

得到链表的头节点

public HeroNode getHead(){
   return head;
}

链表反转的方法

public static void reverseList(HeroNode head){
    if (head.next==null||head.next.next==null){
        return ;
    }
    定义一个变量cur帮我们遍历原来的链表
    HeroNode cur=head.next;  表示第一个元素
    HeroNode next=null;  指向当前节点的下一个结点
    HeroNode reverseHead=new HeroNode(0);
    遍历
    while(cur!=null){
        next=cur.next;  先暂时保存当前节点的下一个结点,并放在新的链表reverseHead的最前端
        cur.next=reverseHead.next;  将cur的下一个结点指向新的链表的最前端
        reverseHead.next=cur;  将cur连接到新链表上
        cur=next;  让cur后移
    }
    head.next=reverseHead.next;
  }
}