前言
你好, 我是Cici。数据结构和算法属于我们技术人员的内功,不管技术怎么更新,它始终都是不变的。无论是出于笔试面试需求,还是个人兴趣爱好,算法题都是值得我们去研究的。 我个人认为想要真正做好一道题目,首先最重要的一件事是 “读懂题目,提取关键信息”
,这样思路才能更加清晰。第二件事就是在编写代码时要多结合框架思维
,什么是框架?说白了就是某一类题型的解题模板,利用框架(利用模板)从整体到细节、从抽象到具体的来解决问题,用这样的思维学习其他知识时也是通用的。
往期同类题目推荐:
21.LeetCode - 合并两个有序链表:解题思路清晰
一、题目分析
原题链接:86. 分隔链表
观察题目,我们可以得到的关键信息有:
- 要对一个链表进行分隔
- 保留 两个分区中每个节点的初始相对位置
二、思路
由关键信息,既然要对现有链表进行分隔,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x
,另一个链表中的元素都大于等于 x
,最后再把这两条链表接到一起,就得到了答案。
解决合并、分隔链表问题的精髓在于虚拟头节点
,这里我们依然要借助虚拟头节点来解决问题。
三、参考代码
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode h1 = new ListNode(-1);
ListNode h2 = new ListNode(-1);
ListNode temp = head;
ListNode t1 = h1;
ListNode t2 = h2;
while(temp != null){
if(temp.val < x){
t1.next = temp;
temp = temp.next;
t1 = t1.next;
t1.next = null; // 断开连接
}else{
t2.next = temp;
temp = temp.next;
t2 = t2.next;
t2.next = null;
}
}
t1.next = h2.next;
return h1.next;
}
}
四、最后
放平心态,努力学习,认真工作,做自己该做的事情,努力实现自己的目标
您的点赞收藏是对我最大的鼓励! 如果大家有什么疑问,欢迎在评论区一起讨论!