链表的翻转(java)

翻转的两种方法:非递归与递归。

1、非递归方法

public ListNode reverse(ListNode node) {
            Node prev = null;
            while (node != null) {
                //每次新建一个链表,用来读取每次循环操作的一个节点
                ListNode tmp = node;
                //将传入的链表指向下一个节点,下次循环将下一个节点重新赋给tmp
                node = node.next;
                //将取出的节点的下一个节点置为上次操作后已完成翻转的部分节点
                tmp.next = prev;
                //将新的完成翻转部分的节点重新赋给待输出的链表
                prev = tmp;
            }
            //输出已完成翻转的链表
            return prev;
  }
        

 

2、递归方法

public Node reverse(ListNode node) {
            ListNode prev = null;
             //递归判断条件,当链表为空或只有一个节点时,跳出递归
            if (node == null || node.next == null) {
                prev = node; 
            } else {
                //完成原链表完成从第二个节点到最后一个节点间的翻转
                ListNode tmp = reverse(node.next);
                //原链表第二个节点指向第一个节点
                node.next.next = node;
                //原链表第一个节点指向空,完成链表翻转
                node.next = null;
                prev = tmp;
            }
            return prev;
}

  

  

posted on 2019-08-14 11:54  西八没天台  阅读(327)  评论(0编辑  收藏  举报