题目:
给定单链表的头节点
head
,请反转链表,并返回反转后的链表的头节点。示例:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
leetcode题目连接:力扣
解法一:迭代
设置三个指针,分别指向左结点leftP,右结点rightP,为了防止反转时链表断开,需要保存右结点后面的一个结点,可以设置为tmpP,在遍历时,让右指针的next为左指针
Java代码实现:
/**
* 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 leftP = null; //使链表最后一个结点指向null
ListNode rightP = head;
while(rightP != null){
ListNode tmpP = rightP.next;
rightP.next = leftP;
leftP = rightP;
rightP = tmpP;
}
return leftP; //leftP成为尾结点
}
}
复杂度分析:
时间复杂度:O(N),N为链表长度
空间复杂度:O(1)
代码执行结果:
解法二:递归
可以把递送过程拆成两个子问题,即head和head.next的子链,head.next的子链的反转可以可以调用reverseList()方法,head的反转可以用head.next.next = head, head.next = null实现
Java代码实现:
/**
* 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 p = reverseList(head.next); //p为head后面已经反转成功的链表,返回值都为p
head.next.next = head;
head.next = null;
return p; //最后返回的都是head,因此直接返回p即可
}
}
复杂度分析:
时间复杂度:O(N),N为链表长度,每个结点都要进行反转
空间复杂度:O(N),N为链表长度,空间复杂度主要取决于递归调用的栈空间,最多为 N 层。
代码执行结果:
以上为个人做题笔记,很多是自己的理解,若有错误还请各位大佬指出~