反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一:递归算法
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next==null){//递归退出条件,当前为空,或者下一个节点为空
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseList(head.next);
//这里请配合动画演示理解:
//如果链表是 1->2->3->4->5,那么此时的cur就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回cur,也就是最后一个节点
return cur;
}
}
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
方法二:迭代法
在遍历链表时,将当前节点的next指针改为指向前一个节点。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;//事先存储其前一个节点
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;//还需要存储后一个节点
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}