剑指 Offer 24. 反转链表(简单)

思路:

方法一:迭代

方法二:递归(*)

 

代码:

方法一:

class Solution {
    public ListNode reverseList(ListNode head) {
		ListNode cur=head,pre=null,next=null;
		while(cur!=null){
			next=cur.next;
			//将前一步的结果加上
			cur.next=pre;
			//放在pre中,又事先了一个节点
			pre=cur;
			//前进了一步
			cur=next;
		}
		return pre;
	}
}

方法二:

class Solution {
    public ListNode reverseList(ListNode head) {
		if(head==null||head.next==null){
			return head;
		}
		ListNode node=reverseList(head.next);
		//相当于1->2->3,3指向了2,但是2仍然还指向着3,会形成环,则将2指向3的指针去掉
		head.next.next=head;
		head.next=null;
		//每次node都连上新节点
		return node;
	}
}

 

分解:

1)方法一:

    i)每次将pre,也就是前一步的结果,接到cur后面,然后pre再更新为cur。这样pre每次就多了一个节点

    ii)cur=next,表明每次cur都向前了一步

迭代的具体图解,可以参考另一道题(https://blog.csdn.net/di_ko/article/details/115110466)

注意这里的pre初始化为null,而不是new ListNode(0),这样0也会加入到排序中

而k个一组翻转链表就可以new ListNode(0)???

 

2)方法二:

    i)相当于1->2->3,3指向了2,但是2仍然还指向着3,会形成环,则将2指向3的指针去掉

head.next.next=head;
head.next=null;

    ii)每次node都连上新节点,再return到上一层

 

复杂度分析:

方法一:

    时间复杂度:O(N) 要遍历链表

    空间复杂度:O(1)指针只占用常数级空间

 

方法二:

    时间复杂度:O(N)

    空间复杂度:O(N)递归相当于栈,有N层

你可能感兴趣的:(力扣刷题之剑指offer,力扣刷题之链表,指针,链表,leetcode,数据结构)