题目描述:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
思路描述:
第一种思路就是生成一个新链表,用头插法将原链表插入进去,较为简单。
第二种思路就是用三个指针,分别指向上一结点,当前结点和下一个结点。从头往尾进行遍历,依次进行反转。
第三种思路就是用递归的方式,依据链表这种递归结构,故我们可以采用递归。
代码:
三指针法:
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode pre=head;
ListNode index=head.next;
if(index==null){
return head;
}
ListNode next=index.next;
if(next==null){
index.next=pre;
pre.next=null;
head=index;
return head;
}
while(next!=null){
index.next=pre;
if(pre==head){
pre.next=null;
}
pre=index;
index=next;
next=next.next;
}
index.next=pre;
head=index;
return head;
}
}
递归:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}