给定单链表的头节点 head
,请反转链表,并返回反转后的链表的头节点。
假设有如图一个链表,因为链表只能通过next里的内容读到下一个节点,所以我们如果想要对链表进行翻转的话就需要将next的内容转化为下图样式:
我们可以用一个prve来储存当前节点的值,然后用一个next来指向下一个节点,这样转移之后就会变成1节点的next指向2节点,2节点指向null,这样迭代下去就可以完成翻转。
/**
* 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 prev=null,next;
ListNode curr=head;//为了判断while循环的边界,需要定义当前位置
while(curr!=null){
next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
}
return prev;
}
}
除了这种迭代的算法外,我们还可以想,这种翻转对于每前后两个节点来说就相当于把后节点的next指向前节点,然后前节点的next指向空就可以完成一个翻转
head.next.next=head;
head.next=null;
但是这种想法有一个问题就是如果从前面开始的话,第二个节点翻转之后就没有办法找到第三个节点了,那么我们能不能从后面开始,先通过递归找到最后一个节点和倒数第二个节点,然后逐步向前完成翻转
/**
* 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) {
if(head==null||head.next==null){
return head;
}
ListNode newHead=reverseList(head.next);//我们要找的是倒数第一,二个元素,所以递归的时候需要传进去head.next
head.next.next=head;
head.next=null;
return newHead;
}
}