参考:链表翻转的图文讲解(递归与迭代两种实现) 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;
}
}
}