//反转链表
public ListNode reverse(ListNode head){
ListNode pre=null;
ListNode temp=null;
while(head!=null){
temp=head.next;
head.next=pre;
pre=head;
head=temp;
}
return pre;
}
}
题解二:通过递归实现
1.先找到要翻转的k个节点,若剩余节点小于k则不需要翻转,只需要直接返回头节点即可
2.对k个节点进行翻转,并返回翻转后的头节点,即本次操作后的尾节点即为下次操作的头节点(翻转为左闭右开区间)。
3.递归翻转k个节点
4.将上一次翻转后的尾节点指向下一轮翻转后的头节点,也就是连接操作。
解法二:递归实现
import java.util.*;
/*
- public class ListNode {
- int val;
- ListNode next = null;
- }
*/
public class Solution {
/**
*
- @param head ListNode类
- @param k int整型
- @return ListNode类
/
public ListNode reverseKGroup (ListNode head, int k) {
if(headnull||head.nextnull){
return head;
}
ListNode tail=head;
for(int i=0;i<k;i++){
//剩余数量不够k个节点,不需要翻转
if(tail==null){
return tail;
}
tail=tail.next;
}
//翻转k个元素
ListNode res=reverseNode(head,tail);
//递归调用,下一轮开始的节点即为tail
head.next=reversKGroup(tail,k)
return res;
}
/* - 翻转链表
- 左开右闭区间 tail为临界值
- @param head ListNode类
- @param tail ListNode
- @return ListNode类
*/
public ListNode reverseNode(ListNode head,ListNode tail){
ListNode pre=null;
ListNode next=null;
while(head!=tail){
next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}
题解三:通过栈来辅助实现
根据栈的特性FILO,一次入栈出栈过程即可达到翻转效果
1.注意k的限制,如果栈内元素不够k个不需要翻转。
2.已经翻转(出栈)的部分与剩下部分相连。
解法三:通过栈实现
import java.util.*;
/*
- public class ListNode {
- int val;
- ListNode next = null;
- }
*/
public class Solution {
/**
*
- @param head ListNode类
- @param k int整型
- @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
//定义一个栈
Stack stack = new Stack();
//存储结果链表
ListNode res = new ListNode(0);
//为新链表定义一个指针,防止后续操作改变头节点
ListNode p = res;
//循环链表
while(true){
//定义指针操作原始链表
ListNode temp =head;
int count =0;
//循环入栈
while(tem!=null&&count<k){
stack.push(temp);
temp=temp.next;
count++
}
if(count!=k){
//剩下节点不够k个,直接将剩余节点插入末尾
p.next =head;
}
//出栈操作
while(!stack.isEmpty()){
p.next=stack.pop();
p=p.next;
}
//重置下一次操作的初始节点
p.next=temp;
head=temp;
}
return res.next;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
*
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!