206 反转链表 java

参考:链表翻转的图文讲解(递归与迭代两种实现)  https://blog.csdn.net/fx677588/article/details/72357389

单链表反转的两种实现(Java)  https://blog.csdn.net/acquaintanceship/article/details/73011169

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

1,遍历法   非递归

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null||head.next==null){////链表为空或者仅1个数直接返回
           return head; 
        }
        ListNode p=head;  //对链表设置两个节点
        ListNode newHead=null;
        
        while(p!=null){
            ListNode temp=p.next;//暂存p下一个地址,防止变化指针指向后找不到后续的数
            p.next=newHead;//p.next指向前一个空间
            newHead=p;//新链表的头移动到p,扩长一步链表
            p=temp; //p指向原始链表p指向的下一个空间
        }
        return newHead;
         
    }
}

 2,递归方式

递归法会逐层确定该节点有没有next节点,若为空,则认定递归到最深层元素。同时将该层节点的next指向父节点,在递归栈中以此类推。

//递归法会逐层确定该节点有没有next节点,若为空,则认定递归到最深层元素。同时将该层节点的next指向父节点,在递归栈中以此类推。
class Solution {
    public ListNode reverseList(ListNode head) {
        
        if(head==null||head.next==null){//链表为空直接返回,而H.next为空是递归基
            return head;
        }else{
            ListNode newHead= reverseList(head.next);  //一直循环到链尾 
            head.next.next=head; //翻转链表的指向


//如果注释掉head.next=null; 1、2号节点闭环问题。由于1号节点的next没有置空,依旧指向2号节
//点,所以遍历时候肯定存在环。
            head.next=null; //记得赋值NULL,防止链表错乱,
            return newHead;
        }
         
    }
}

猜你喜欢

转载自blog.csdn.net/nsjlive/article/details/82425391