leetcode 反转链表

反转一个单链表。

示例:

输入: 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 ;

    }
}

猜你喜欢

转载自blog.csdn.net/a627082796/article/details/86494071