链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)
题目
给定一个单向链表头节点head,和一个整数pivot。
实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的。对调整后的节点顺序没有更多的要求
链表9->0->4->5->1 pivot=3 |
调整后:1->0->4->9->5,也可以是0->1->9->5->4与顺序无关 |
思路
普通解法的时间复杂度为O(N),额外空间复杂度O(N),具体过程如下:
- 遍历链表,获得链表长度N
- 生成长度为N的Node类型数组nodeArr,再遍历一次链表,并将节点一次放进nodeArr中
- 在nodeArr中进行顺序调整
- 将nodeArr中节点依次连接
源码
public class Node{public int value;public Node next;public Node(int data){this.value=data;}
}public Node listPartition1(Node head,int pivot){if(head==null){return head;}Node cur=head;int i=0;while(cur!=null){i++;cur=cur.next;}Node[] nodeArr=new Node[i];i=0;cur=head;for(i=0;i!=nodeArr.length;i++){nodeArr[i]=cur;cur=cur.next;}arrPartition(nodeArr,pivot);for(i=1;i!=nodeArr.length;i++){nodeArr[i-1].next=nodeArr[i];}nodeArr[i-1].next=null;return nodeArr[0];
}public void arrPartition(Node[] nodeArr,int pivot){int small=-1;int big=nodeArr.length;int index=0;while(index!=big){if(nodeArr[index].value<pivot){swap(nodeArr,++small,index++);}else if(nodeArr[index].value==pivot){index++;}else{swap(nodeArr,--big,index);}}
}
public void swap(Node[] nodeArr,int a,int b){Node tmp=nodeArr[a];nodeArr[a]=nodeArr[b];nodeArr[b]=tmp;
}
链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)相关推荐
- 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)
题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.调整后的节点顺序要保持与原链表中节点的先后次序一 ...
- [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...
问题描述 普通问题:给定一个单向链表的头节点head,节点的值类型是整数,再给定一个整数 pivot,实现一个调整链表的函数: 使得左半部分的值都是小于pivot的节点,中间部分都是等于pivot的节 ...
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
C++ 版 /*************************************************************************> File Name: 023. ...
- 将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺
这道题一开始想到的方法可能就是patition方法了,大概思路我说一下,先把这个链表存为数组(说明其空间复杂度为0(1)),然后在对这个数组进行patition,即定义两个指针,一个指向数组的-1位置 ...
- 将数组排列成左边小,中间相等,右边大的形式 给定链表节点数组和某个值
题目出自左程云书 原题是将给定一个链表和一个数,将其排列成左边小, 中间等于,右边大于某个数的形式 解:将链表的节点先存入一个Node数组,将数组排序,再将数组中的链表节点连接起来 以下是节点排序函数 ...
- 链表问题4——反转单向链表
题目 实现反转单向链表的函数 要求 如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1). 源码 public class Node{public int value;public ...
- 将单向链表按某值分成左边小、中间相等、右边大的形式
[题目] 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个 整 数pivot 实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于pivot的节 ...
- 链表之反转部分单向链表
package com.chenyu.zuo.linkedList;import com.chenyu.zuo.linkedList.RemoveByRatio.Node;/*** 题目:给定一个单向 ...
- 数据结构链表之单向链表:Python3 实现单向链表——1
Python3 实现单向链表 链表定义与简介 定义:链表与顺序表(Python中列表)性质相反,链表是物理单元上非顺序的.非连续的,在逻辑顺序上其数据元素是通过指针实现的,组成链表的每一个元素也可以叫 ...
最新文章
- java实现人字拼,地板怎么玩花式人字拼铺法 人字拼地板家居实例图
- pythorch学习笔记
- 使用fastDFS客户端改造文件上传
- linux 漏洞 poc,CVE-2017-11176: 一步一步linux内核漏洞利用 (二)(PoC)
- 美国影视演员协会选择了Windows Azure
- DtCms.ActionLabel.Article.cs
- 听说Mutex源码是出名的不好看,我不信,来试一下
- wince7 屏幕控制_技术干货:WinCE 7.0下的触摸屏驱动
- input和button放在同一行_黑龙江作家协会冯殿波散文集《足音》84情系东保卫,魅力采风行...
- bat文件去掉变量 字符串中的空格
- android应用安全——数据安全
- TCP and UDP
- Oracle 10g 数据库连接出现The Network Adapter could not establish the connection解决办法
- Win32屏幕保护程序
- android 小游戏心得、,滴答滴答:双人故事
- 成都-峨眉山(乐山)旅游攻略
- MySQL讲义第 43 讲——select 查询之查询练习(一)
- Cadence元器件封装库
- 微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
- 还不懂shell脚本核心?这一篇就够了。