leetcode链表专题
主要根据CSview一个校招刷题准备网站 做这个网站的人真的很厉害!进行整理
太困了,一学习就困,来刷刷题
文章目录
前言
一、leetcode 206.反转链表
1.题目描述:
2.主要有两种方法,迭代法和递归法
先来描述两者的区别:
迭代法(Iteration)和递归法(Recursion)都是解决问题的方法,它们在编程中经常被用到。
迭代法是通过循环的方式,重复执行某段代码直到满足条件为止。通常使用迭代语句(如for循环或while循环)来实现。迭代法通常比递归法更直观,更容易理解,并且在一些情况下效率更高。它的实现方式类似于人们在日常生活中的思考方式,一步一步地解决问题。
递归法则是指一个函数在执行过程中调用自己的编程技巧。递归的本质是将问题划分为规模更小的子问题,并不断地重复这个过程直到达到最基本的情况,然后逐层返回结果。递归在某些情况下更为简洁,但可能会导致栈溢出或性能问题,因为每次递归调用都会增加函数调用栈的深度。
3.迭代法:
我们可以思考,是否可以通过指针指向位置的交换来实现反转。
定义三个指针:
prev代表在迭代过程中已经反转的头节点,初始值指向null;
curr指向当前节点,也就是待反转部分的头节点。初始值为链表的头节点head; 。
next指向curr.next节点,当前节点的下一个节点;
prev=null;
curr=head;
next=null;
//交换过程如下:
next=curr.next;
curr.next=prev;
prev=curr;
curr=next;
让我们以具体的示例来描述迭代法中的每个循环。
假设原始链表为:1 -> 2 -> 3 -> 4 -> 5,我们将对其进行反转。
-
初始化:
- 初始时,
prev = null
,curr = 1
,next = null
。 - 链表状态:
prev
->null
,curr
->1
->2
->3
->4
->5
,next
->null
。
- 初始时,
-
第一次迭代:
- 进入循环,
next
指向curr.next
,即2
。 - 链表状态:
prev
->null
,curr
->1
->null
,next
->2
->3
->4
->5
。 - 将
curr.next
指向prev
,即1
的next
指向null
。 - 移动
prev
到curr
的位置,即prev
->1
。 - 移动
curr
到next
的位置,即curr
->2
。
- 进入循环,
-
第二次迭代:
- 进入循环,
next
指向curr.next
,即3
。 - 链表状态:
prev
->1
->null
,curr
->2
->null
,next
->3
->4
->5
。 - 将
curr.next
- 进入循环,