一、题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
二、思路
方法1:递归
直接对子链表进行递归;
调用递归的时候会调用n层栈、时间复杂度空间复杂均是O(n)。
方法2:原地反转
反转当前结点、保存后一个结点、整体右移一位。
若当前结点不为空:,
反转:
使用临时结点temp保存当前结点的下一个结点;
当前结点的next指向cur的前一个结点;
保存(移动一位):
prev =cur;
cur =temp;
时间复杂度均是O(n)。复杂度空间复杂O(1)
三、代码
3.1递归写法:
class Solution {
public ListNode reverseList(ListNode head) {
// 特殊情况
if(head ==null||head.next == null){
return head;
}
ListNode temp = reverseList(head.next);
head.next.next=head;
head.next=null;
return temp;
}
}
执行结果:
3.2 原地反转
class Solution {
public ListNode reverseList(ListNode head) {
// 特殊情况
if(head ==null||head.next == null){
return head;
}
ListNode prev = null;
ListNode cur = head;
while(cur!= null){
ListNode temp = cur.next;
cur.next = prev;
prev = cur;
cur = temp;
}
return prev;
}
}
执行结果: