链表分割——牛客剑指offer
题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
题目分析:
将链表分割为两部分,以x值为分割线(x不一定存在于链表中):前部分链表结点的值是小于x的,而且这一部分各结点的顺序与在原链表中的相对顺序相同。后部分链表结点的值是大于等于x的,而且这一部分各结点的顺序与在原链表中的相对顺序相同。
例如,链表{1,3,7,4,2,5} 以值4分割,结果为{1,3,2,4,7,5}
链表{1,3,7,2,5} 以值4分割,结果为{1,3,2,7,5}
解题思路:
新建一个链表-->创建一个值为x的结点nodex
迭代遍历原链表的结点:
如果结点值小于x:插入到x结点nodex的前面(插入到前半部分的最后一个位置)
如果结点指大于x:插入到新链表的最后面(插入到后半部分的最后一个位置)
代码实现:(含验证)
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class splitList {
public ListNode partition(ListNode pHead, int x) {
if(pHead==null){
return null;
}
//创建x结点作为分割前半部分和后半部分的中间结点
ListNode nodex=new ListNode(x);
//创建newHead结点方便第一个小于x值的插入
ListNode newHead=new ListNode(0);
newHead.next=nodex;
//创建before结点,在迭代过程中始终保持before.next=nodex
//从而保证小于x值的结点可以插入到nodex结点之前
ListNode before=newHead;
//创建after结点,在迭代过程中始终保持after结点是最后一个结点
//从而保证大于等于x值的结点可以插入链表的最后位置
ListNode after=nodex;
ListNode walkNode=pHead;
boolean isexist=false;
while(walkNode!=null){
//如果当前节点小于x,复制结点并将其插入到xnode的前一个结点,然后移动before指针
if(walkNode.val<x){
ListNode node=new ListNode(walkNode.val);
before.next=node;
node.next=nodex;
before=node;
}
//如果当前节点大于x,复制结点并将其插入到链表最后一个结点,然后移动after指针
else if(walkNode.val>=x){
ListNode node=new ListNode(walkNode.val);
after.next=node;
after=node;
}
walkNode=walkNode.next;
}
//忽略自建的x结点nodex和头结点newHead;
//因为x结点不一定存在于原链表,所以此处要将分开的前后部分相连
before.next=nodex.next;
return newHead.next;
}
public static void main(String []args){
ListNode head = new ListNode(3);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(3);
head.next = node2;
node2.next = node3;
node3.next = node4;
splitList split =new splitList();
ListNode returnHead=split.partition(head,3);
while (returnHead != null)
{
System.out.println(returnHead.val );
returnHead = returnHead.next;
}
System.out.println();
}
}
链表分割——牛客剑指offer的更多相关文章
- 链表中环的入口结点——牛客剑指offer
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析: 从上图中可以看出,环的入口结点和其他结点的区别:环的入口结点是有两个指针指向的,其他结点除了头结点都 ...
- 删除链表中重复的结点——牛客剑指offer
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...
- 牛客剑指offer(持续更新~)
第一题:二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- 从尾到头打印列表——牛客剑指offer
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 思路1: 顺序遍历链表,取出每个结点的数据,插入list中. 由于要求list倒序存储链表中的数据,而我们是顺序取 ...
- 二维数组中的查找——牛客剑指offer
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 链表分割 牛客网 程序员面试金典 C++ Python
链表分割 牛客网 程序员面试金典 C++ Python 题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* p ...
- Java链表常见操作【剑指Offer】03:从尾到头打印链表
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题解一:递归 /* 在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(listNode.val ...
- 牛客剑指Offer-数字在升序数组中出现的次数
题目 统计一个数字在升序数组中出现的次数. 示例1 输入 [1,2,3,3,3,3,4,5],3 返回值 4 题解 第一种最简单的方法是O(n)复杂度.遍历数组统计结果. public int Get ...
- 面试题目——《剑指Offer》
1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...
随机推荐
- 【模板】强连通分量和tarjan算法
看了好久才终于明白了这个算法..复杂度是O(n+m). 我觉得这个算法不是很好理解,但是看懂了以后还是觉得听巧妙的. 下面给出模板代码和三组简单数据帮助理解. 代码如下: #include <s ...
- 处理flutter http请求添加application/json报错Cannot set the body fields of a Request with content-type “application/json”
在flutter中在http请求发送时设置"content-type": "application/json"会出现报错Cannot set the body ...
- k8s部署03-----常用运维命令
kubectl常用命令 kubectl get nodes #查看集群中有多少个node kubectl describe node <node_name> #查看某个node的详细信息 ...
- C++ STL——常用算法
目录 一 常用查找算法 二 常用遍历算法 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 常用查找算法 /* find算法 查找元素 @param ...
- ThreadLocal详解【使用场景】
转: 么是ThreadLocal 根据JDK文档中的解释:ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性. 从这里可以看出,引入Thre ...
- 如何快速通过json构建javabean对象(Intellij IDEA-->GsonFormat使用教程)
和第三方对接的时候,返回给我们的json时参数字段多是很常见的现象,所以我们手动去创建javabean肯定是要花费不少时间,博主在网上找到了很多种,可用通过json自动生成javabean的工具,这里 ...
- ajax的回调函数
ajax的回调函数(done,fail,always) 观看代码: $.ajax({ type: "post",//请求的类型 url: "/book/detail?ac ...
- JAVA 基础编程练习题13 【程序 13 根据条件求数字】
13 [程序 13 根据条件求数字] 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 程序分析:在 10 万以内判断,先将该数加上 100 后 ...
- 记一次排查mysql数据库连接未关闭问题的过程
在一些项目中由于一些特殊原因仍然保留着显示的获取数据库连接(Connection).提交事务.回滚事务.关闭连接等操作:其中关闭连接是比较容易疏忽又比较难在前期发现的问题. 我是如何排查连接未关闭的问 ...
- Hyperledger Fabric1.4 网络环境搭建步骤
1. 外部访问虚拟机: 安装ssh apt-get install openssh-server openssh-client 2. 安装vim sudo apt install vim 3. ...