题目描述
注意: 迭代和递归方法都要会
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
提示:
- 链表中节点的数目范围是 [0, 5000]
- -5000 <= Node.val <= 5000
题解
迭代方法:
新建头节点res,然后遍历head,把head之中的每一个节点都插入res在之后。最后返回res.next
class Solution {
public ListNode reverseList(ListNode head) {
ListNode res = new ListNode();
ListNode cur = head;
while (cur != null){
head = head.next;
cur.next = res.next;
res.next = cur;
cur = head;
}
return res.next;
}
}
递归方法:
1、递归终止条件:head == null 或者 head.next == null
2、返回值:返回尾节点
3、处理逻辑:每一层的逻辑是把当前节点和下一个节点的顺序调换,head为当前节点。
head.next.next = head;
head.next = null;
用tmp接收递归函数返回的尾节点,tmp是尾节点,处理结束之后返回tmp。
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode tmp= reverseList(head.next);
head.next.next = head;
head.next = null;
return tmp;
}
}