反转链表
1.题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
2.思路
反转链表可以使用两种方式来解决
第一种方式:通过两个指针将链表进行反转,一个指针指向当前节点,一个指针指向上一个节点。
在进行反转时,先保存当前节点cur的下一个节点next,然后将当前节点cur的下一个节点指向上一个节点pre,然后再将上一个节点pre赋值成我们的当前节点cur,最后把我们的当前节点cur赋值为之前保存的下一个节点next
第二种方式:通过递归的方式找到我们的最后一个节点,然后从后往前,先设置当前节点的下一个节点的下一个节点为当前节点,使其成为一个闭环,然后将当前节点的next设置为null,最后返回即可。
3.代码
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 reverseList1(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
// 第二种方式
public ListNode reverseList2(ListNode head) {
if(head.next == null || head == null){
return head;
}
ListNode newNode = reverseList2(head);
head.next.next = head;
head.next = null;
return newNode;
}
}