文章目录
哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是Java。之前一大段时间都是在学习web开发的一些技术,就很久没有进行类似于数据结构、算法之类的学习与刷题,打算这段时间拾起来好好学一学、搞一搞。
这段时间也是机缘巧合看到草帽路飞的博客,加了自学群,正巧看到博主组织在群里组织了leetcode刷题打卡活动,我也就参与进来,为期一个月,打算坚持每天都花一些时间做一些题目,并通过博客的方式来进行记录。
目前跟着一个Github仓库刷题(leetcode):代码随想录leetcode刷题,当前为链表专题。
题目来源leetcode
leetcode地址:206. 反转链表,难度:简单。
题目描述(摘自leetcode):
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
本地调试代码:
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){
...
}
public static void main(String[] args) {
ListNode node7 = new ListNode(7, null);
ListNode node6 = new ListNode(6, node7);
ListNode node5 = new ListNode(5, node6);
ListNode node4 = new ListNode(4, node5);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);
//反转链表
ListNode listNode = new Solution().reverseList(node1);
//遍历
printList(listNode);
}
private static void printList(ListNode listNode) {
if(listNode == null){
return;
}
System.out.print("[");
while(listNode != null){
System.out.print(listNode.val);
if(listNode.next != null){
System.out.print(",");
}
listNode = listNode.next;
}
System.out.print("]");
}
}
No1:双指针法
思路:定义前置指针及当前指针,遍历链表每个节点时移动前置、当前指针,遍历到某个节点时首先使用临时变量存储当前指针的next,紧接着进行反转操作将当前指针指向节点的next指向前置指针,接着两个指针统一往后移即可。
代码:
/**
* 双指针法
* @param head
* @return
*/
public ListNode reverseList(ListNode head){
//head为null或一个时
if(head == null || head.next == null){
return head;
}
//定义两个指针
ListNode temp;
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
temp = cur.next;
cur.next = pre;
//指针移动,各自向后移动
pre = cur;
cur = temp;
}
return pre;
}
NO2:递归解法
思路:当有重复相同的动作时你就可以使用到递归,这里反转链表实际上就有大量相同的反转操作。递归方法参数定义两个,一个是前置指针指向的节点、第二个是当前指针,将当前指针为null情况作为出口返回反转链表后的头节点也就是参数中的前置指针。每个重复方法中的核心操作就是:cur.next = pre;
。
代码:
/**
* 递归
* @param head
* @return
*/
public ListNode reverseList(ListNode head){
return reverse(null,head);
}
/**
* 反转,其实也就是遍历了一遍
* @param pre
* @param cur
* @return 原始链表最后一个节点
*/
private ListNode reverse(ListNode pre, ListNode cur) {
//递归终止条件
if(cur == null){
return pre;
}
//提前保存下一个节点
ListNode temp = cur.next;
//进行链表中某个节点next指向反转
cur.next = pre;
return reverse(cur,temp);
}
[1]. leetcode题解
[2]. 代码随想录leetcode刷题—反转链表
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习