反转链表题型练习(一)
练习题源:
1.反转链表巩固复习
题目:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
使用迭代方式 求解
public ListNode reverseList(ListNode head) {
//先设置两个指针
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
//curr限制循环
ListNode next = curr.next;
//先记住curr.next的这个节点,方便后面指针运行
curr.next = prev;
//反转
prev = curr;
curr = next;
}
return prev;
//当curr=null时,表头在prev,故返回prev
}
解题思路
1.可以确定目前prev=null curr=head
2.由题意进行反转,那么curr.next=prev
3.但是本应储存curr.next的盒子就没有了,所以应设置一个用来变量保存的指针next
4.prev和curr按照顺序移动,变为prev=curr curr=next
5.由此循环往复,直到curr=null时
6.此时不应返回head值,应返回表头,而表头为prev,所以返回prev
使用递归方式 求解
public ListNode reverseList(ListNode head) {
// 递归终止条件
if (head == null || head.next == null) {
return head;
}
//自己调自己,一步步往下传
ListNode p = reverseList(head.next);
//把大问题分解成小问题
head.next.next = head;
head.next = null;
//返回第一个元素:5
return p;
}
解题思路 1.满足递归方法的三个条件:1)把大问题拆成两个子问题;2)子问题与大问题一样 3)存在最小问题(curr=5,head.next=null head=null)
2.首先先看1和2,可知反转就是把head.next的next变为head,而head的next变为null
3.因为链表必须由当前找下一个元素,所以先从最后开始,之后可以再次调用自己,调用head.next,因为此时head.next为prev值
4.最后再返回第一个元素:5(即为表头)