这道题一开始想到的方法可能就是patition方法了,大概思路我说一下,先把这个链表存为数组(说明其空间复杂度为0(1)),然后在对这个数组进行patition,即定义两个指针,一个指向数组的-1位置small,一个指向数组的arr.length位置big,然后来与value比较,比较之后有三种情况:

1. arr[index] < value,这个时候,swap(arr, index++,++small)(主要small要先++再交换,因为其刚开始是-1)

2.arr[index] = value,这个时候,直接index++就行,

3. arr[index] > value 这个时候,swap(arr,index,--big)(主要这里的index不用++)

下面附上源代码:

public static class Node {
private int value;
private Node next;

public Node(int data) {
this.value = data;
}
}

public static void printLinkedList(Node node) {
System.out.print("LikedList is:");
while (node != null) {
System.out.print(node.value + " "); // 记得是node.value而不是简单的node
node = node.next;
}
System.out.println();
}

public static Node SmallEqualBig1(Node head, int value) {
if (head == null) { // 如果为空,直接返回head
return head;
}
Node cur = head;
int i = 0;
/* 这里是为了求出链表的大小,并将其赋值到数组中 */
while (cur != null) {
i++;
cur = cur.next;
}
Node nodeArr[] = new Node[i];
cur = head;
i = 0;
while (cur != null) {
nodeArr[i] = cur;
cur = cur.next;
i++;
}
/*
* patition过程,将小于value的值放左边(small++,index++),将大于value的值放右边(big--,index不变),
* 将等于value的值不变(index++)
*/
arrPatition(nodeArr, value);
/* 将patition之后的数组存到链表里面来,这个步骤很重要,要记住 */
for (i = 1; i != nodeArr.length; i++) {
nodeArr[i - 1].next = nodeArr[i];
}
nodeArr[i - 1].next = null;// 这个步骤很容易忘记
return nodeArr[0];// 返回头链表
}

/* 这个过程非常重要,要记住 */
public static void arrPatition(Node nodeArr[], int value) {
int small = -1;
int big = nodeArr.length;
int index = 0;

while (index != big) {
if (value == nodeArr[index].value) {
index++;
} else if (value > nodeArr[index].value) {
swap(nodeArr, ++small, index++);
} else {
swap(nodeArr, --big, index);
}
}
}

public static void swap(Node nodeArr[], int i, int j) {
Node temp = nodeArr[i];
nodeArr[i] = nodeArr[j];
nodeArr[j] = temp;

}

进阶题目:

其实说到底就是增加两个条件:

1. 空间复杂度要为0(1)

2. 稳定性要好

其实我个人觉得这种方法实现起来更加容易一点,不信你们可以看一下源代码:

/* 这种方法空间复杂度为O(1),其实这种方法更方便,很容易实现,并且b格更高,因为它的稳定性比上面的方法好 */
public static Node SmallEqualBig2(Node head, int value) {
/*
* 定义六个指针,分别是smallhead,smalltail,equalhead,equaltail,bighead,bigtail,还有一个next指针
*/
Node sh = null;
Node st = null;
Node eh = null;
Node et = null;
Node bh = null;
Node bt = null;
Node next = null;
/* 一下是主要实现部分,也不难理解 */
while (head != null) {

next = head.next;// 将head.next赋值给next,下面将head.next指向null
head.next = null;
if (head.value < value) {
if (sh == null) {
sh = head;
st = head;
} else {
st.next = head;
st = head;
}
} else if (head.value == value) {
if (eh == null) {
eh = head;
et = head;
} else {
et.next = head;
et = head;
}
} else {
if (bh == null) {
bh = head;
bt = head;
} else {
bt.next = head;
bt = head;
}
}
head = next; // 这一步别忘了,将指针往下面移动,head==null时停止
}

// 连接small部分和equal部分,如果sh!=null就可以连,st.next = eh,
if (st != null) {
st.next = eh;
// 如果中间部分没有与value相等的元素的话,就将st赋值给et
if (et == null) {
et = st;
}
}

// 连接equal和big部分,如果et!=null就可以连,et.next = bh
if (et != null) {
et.next = bh;
}
// 返回一个链表的头部,判断small部分==null?,再判断equal==null?不然就是bh了
if (sh != null) {
return sh;
} else if (eh != null) {
return eh;
} else {
return bh;
}
}
}

将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺相关推荐

  1. 将单向链表按某值划分成左边小、中间相等、右边大的形式

    C++ 版 /*************************************************************************> File Name: 023. ...

  2. [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...

    问题描述 普通问题:给定一个单向链表的头节点head,节点的值类型是整数,再给定一个整数 pivot,实现一个调整链表的函数: 使得左半部分的值都是小于pivot的节点,中间部分都是等于pivot的节 ...

  3. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)

    题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.调整后的节点顺序要保持与原链表中节点的先后次序一 ...

  4. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)

    题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.对调整后的节点顺序没有更多的要求 链表9-> ...

  5. 将数组排列成左边小,中间相等,右边大的形式 给定链表节点数组和某个值

    题目出自左程云书 原题是将给定一个链表和一个数,将其排列成左边小, 中间等于,右边大于某个数的形式 解:将链表的节点先存入一个Node数组,将数组排序,再将数组中的链表节点连接起来 以下是节点排序函数 ...

  6. 将单向链表按某值分成左边小、中间相等、右边大的形式

    [题目] 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个 整 数pivot 实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于pivot的节 ...

  7. java数组转换成单链表_【转】单向链表(单链表)的Java实现

    最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因 ...

  8. 6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: ```cpp struct stu

    6-4 学生成绩链表处理 (20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表:另一个将成绩低于某分数线的学生结点从链表中删除. 函数接口定义: struct stud_node *c ...

  9. 2. 输入若干个学生信息(包括学号、姓名和某科成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出。 输入输出示例: 1 Zhang 78 2 Wang

    输入若干个学生信息(包括学号.姓名和某科成绩),输入学号为0时输入结束,建立一个单向链表,再输入一个成绩值,将成绩大于等于该值的学生信息输出. 输入输出示例: 1 Zhang 78 2 Wang 80 ...

最新文章

  1. shell 函数返回值接收问题
  2. MySQL B+树索引和哈希索引的区别
  3. VTK:Utilities之GetDataRoot
  4. 数据结构——二叉搜索树的C语言实现
  5. 9.jsonp的实现原理
  6. WMS仓库管理系统---(12)货位库存管理
  7. QT之QTreeView使用总结
  8. 软考中级网络工程师学习笔记(知识点汇总)详细版本
  9. PS 色彩平衡之算法公式原理详解及 Python 实现
  10. 一篇文章,读懂9种优先的管理之道
  11. 前台、中台、后台到底是什么?
  12. 家用台式计算机硬件配置清单,台式电脑组装配置清单
  13. 「GoTeam 招聘时间」ANKER Golang 开发工程师(深圳)
  14. 在deepin系统下安装git
  15. html的table 菜鸟,HTML table 标签 | 菜鸟教程
  16. Elasticsearch 7.10 之 Data tiers
  17. 环路分析仪Bode100
  18. 5G对广播电视的影响以及应用-论文
  19. 电线电缆使用时的安全要求和存放方法
  20. 录屏软件哪个好用?10个免费好用的「录屏软件」推荐

热门文章

  1. c语言中的printf函数_C语言中的printf()函数与示例
  2. 子网掩码+ip地址_C ++程序使用位掩码查找唯一编号
  3. 阿里巴巴为什么禁止使用Apache Beanutils进行属性复制?
  4. 安卓手机使用linux(含图形界面)——Aid Learning
  5. C++ DNN Opencv3.4 实现人脸计数和人脸检测
  6. Linux (Ubuntu/CentOS) 添加用户并授予sudo的权限
  7. Python函数定义变量报错:local variable ‘a‘ referenced before assignment
  8. LeetCode450题—— 删除二叉搜索树中的节点
  9. ES建立索引步骤, 1,index 2.mapping 3,别名
  10. tf.contrib在tf2中无法使用