反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路:
利用递归完成:1.主要是要考虑什么时候跳出递归。因为链表的最后一位指向空,所以到最后一位就肯定不需要递归了,需要返回值了,此时返回的肯定是最后一个节点,是最深的节点,也就是尾节点。
2.只有当递归走到最后一步的时候,才能返回,此时返回的也肯定是第一个返回的结果。所以要在它的上一个节点去进行反转的规则处理,也就是 上一个节点被当前节点所指向。然后上一个节点指向空。
3. 注意空节点的情况写在前面,否则当节点为空时,空节点没有指向,会报空指针错误。
/**
* 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 ) {
return head;
}
if(head.next == null ) return head;//此处一定要注意空节点和单节点的判断分开写,否则如果测试的是空节点,就会出现空指针的错误。
//如果不是空节点,返回的肯定是对下一个节点的递归。但是要先处理该节点
//该节点的从头开始,让第二个节点指向第一个,第一个节点指向空,表示尾节点
ListNode second = head.next;
ListNode nextnode = reverseList(second); //对下一节点进行递归
second.next = head;
head.next=null;
//返回下一节点的递归
return nextnode ;
}
}