206.链表反转
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
解题:
第一种方法-迭代
1. 思路:就是现在这个节点需要指向前一个节点,你需要知道当前节点,和前一个节点,所以需要设置临时变量。然后呢,你把当前节点指向前一个节点之后,无法再找到下一个节点,所以需要先把下一个节点的信息保存一下
还有代码里面用的是while循环,因为for循环你需要知道个数,迭代器链表用不了
你需要知道你循环到哪个位置了,因为不是for循环,需要自己指定当前循环元素,循环结束条件就是循环的当前元素不能为空
2.代码
/**
* 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; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode next;
ListNode current = head;
while(current != null){
next = current.next;
current.next = pre;
pre = current;
current = next;
}
return pre;
}
}
第二种方法-递归
1.思路: 就是很直接后一个节点指向前一个节点,但是如果你后一个节点指向前一个节点之后呢,你就找不到再后面的节点信息了,所以呢,你需要从最后一个节点开始反转,就需要递归找出最后一个节点
2.代码
这里面就是你每次返回的都是最后一个节点,一直在执行中间那两步
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode node = reverseList(head.next);
head.next.next = head;
head.next = null;
return node;
}
}