前言:
大家好,我是良辰丫🚀🚀🚀,今天带大家刷一个力扣链表题,有人可能会说,一道题够嘛,刚开始刷题别着急,毕竟,心急吃不了热豆腐,🍾🍾🍾我们慢慢来,先积累思想,脑子里的东西多了,敲代码敲得多了,有一天,你会发现你也可以做到“下笔如有神”,废话不多说,我们来看一下这道题,我把题目链接放到了下边,大家可以去做一下。💖💖💖
题目链接: 力扣第328题,奇偶链表
🧑个人主页:良辰针不戳
📖所属专栏:EveryDay学java
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
📜作者能力有限,也会出错,希望大家可以指正。
💞愿与君为伴,共探Java汪洋大海。
目录
- 1、题目介绍
- 2、题目分析
1、题目介绍
题目:
- 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
- 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
- 请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
- 你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
提示:
- n == 链表中的节点数
- 0 <= n <= 104
- -106 <= Node.val <= 106
2、题目分析
做题的第一步是什么呢?有人说思路分析,你连题目都没看懂,笔试的时候做编程题,题目都没读懂或者懵懵懂懂的读错了题,分析了半天,写了不着边际的代码,时间浪费了那么多,从头再来?时间不等人呀!就因为不细心,本来可以做出来的题目没有做出来,这家公司与你无缘了,哈哈,还是注重细节。
我做这道题就看错了,人家写的是奇数的节点和偶数节点,而我看成了数值val为奇数和偶数,一顿操作猛如虎,结果答案不对,脑瓜里充满了问号,捉摸了半天,代码没毛病呀,然后答案进行对比,才发现了错误,因此呢,大家一定要看清题,而且把题目的例子多看几遍,这样有助于消化题目。
题目分析:
- 奇数节点放左边,偶数节点放右边,遇到这种分段题,咱们首先要培养的就是分段思路,分成两个节点段,奇数段和偶数段,通过遍历找到奇数节点和偶数节点进行拼接。
- 那么,如何进行拼接呢?我们要有双指针思想,前段和后段分别有首尾指针。下面我将通过注释的方式详细解析代码,希望能给大家带来帮助。
class Solution {
public ListNode oddEvenList(ListNode head) {
//没有节点或者只有一个节点,直接返回头结点
//0个或1个就没有操作的必要了
if(head == null || head.next == null){
return head;
}
//s:start
//e:end
//bs:前段首指针
//be:前段尾指针
//as:后段首指针
//ae:后段尾指针
ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;
//通过cur进行遍历
ListNode cur = head;
//通过计数器记录第几个节点
int count = 1;
while(cur != null){
//奇数节点放在前一段
if(count % 2 == 1){
//前段节点第一次插入时首尾指针都需要移动
if(bs == null){
bs = cur;
be = cur;
//不是第一次插入时只需要移动尾节点
} else {
be.next = cur;
be = be.next;
}
//偶数节点放在后一段
} else {
//后段当节点第一次插入时首尾指针都需要移动
if(as == null){
as = cur;
ae = cur;
//后段当节点不是第一次插入时只需要移动尾节点
} else {
ae.next = cur;
ae = ae.next;
}
}
//cur的移动放在外面,减少时间复杂度
cur = cur.next;
//计数器加加
count++;
}
//遍历完成后进行拼接操作
//前一段无数据时,直接返回后一段
if(bs == null){
return as;
}
//走到这一步说明前一段有数据,前后进行拼接
be.next = as;
//后一段有数据时,后一段尾巴一定要有null,要不然打印无法停下来
if(as != null){
ae.next = null;
}
//拼接完成后,返回第一段首节点
return bs;
}
}
后序:
今天的分享就到这里了,希望可以给大家带来帮助,喜欢的话记得三连哦,希望可以和大家一起学习,善交朋友,想一起学习的联系我哦!!!🍎🍎🍎