Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.

思路:

1.由于不能改变原来的相对位置,所以直接置换值是不行的。

2.其实这个题类似于快速排序的Partition函数,该思路是,随机从数组中选取一个值作为参考值,使得数组中比该参考值小的数字排在参考值左端,数组中比该参考值大的数字排在参考值右端。

遍历所有节点,发现比x小的节点就”交换“,交换的过程即先删除那个节点,然后插入到对应位置。

这里有一个前提,即若第一个数就小于x的话,是不需要“交换的”。

另外一点需要注意的是:删除链表某个节点之后,指针p的值可能出现不定义状态,故在删除之前,先让p指向要删除节点的下一个节点。

 class Solution {
public:
//删除链表中位置为loc的节点,从1开始
int Delete(ListNode* &head,int loc){
ListNode* p=NULL;
ListNode* q=NULL;
p=head;
int i=;
//找到前驱节点
while(i<loc-&&p->next){
++i;
p=p->next;
}
q=p->next;
p->next=q->next; int val=q->val;
free(q);
return val;
}
ListNode* Insert(ListNode* &head,int loc,int val){
ListNode* p=head;
p=head;
int i=;
if(loc==){
ListNode* s=(ListNode*)malloc(sizeof(ListNode));
s->val=val;
s->next=p;
return s;
}
//找到前驱节点
while(i<loc-&&p->next){
++i;
p=p->next;
}
ListNode* s=(ListNode*)malloc(sizeof(ListNode));
s->val=val;
s->next=p->next;
p->next=s;
return head;
}
ListNode *partition(ListNode *head, int x) {
if(head==NULL) return NULL;
int insertloc=;
int loc=;
ListNode* p=head;
while(p!=NULL)
{
++loc;
if(p->val<x)
{
++insertloc;
if(insertloc!=loc){
p=p->next;
int val=Delete(head,loc);
head=Insert(head,insertloc,val);
continue;
}
}
p=p->next;
}
return head;
}
};

Partition List(链表的插入和删除操作,找前驱节点)的更多相关文章

  1. 数据结构Java实现03----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  2. 面试之路(10)-BAT面试之java实现单链表的插入和删除

    链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...

  3. 数据结构Java实现02----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  4. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  5. Java创建二叉搜索树,实现搜索,插入,删除操作

    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除) 首先我们要有一个编码的思路,大致如下: 1.查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查 ...

  6. [剑指offer]09用两个栈实现队列插入和删除操作,C++实现

    原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...

  7. c++利用类进行单链表的插入,删除,清空操作

    #if 1 #include <iostream> #include <stdlib.h> #include <time.h> #include <fstre ...

  8. React---简单实现表单点击提交插入、删除操作

    import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...

  9. STL——容器(List)List 的数据元素插入和删除操作

    push_back(elem); //在容器尾部加入一个元素 1 #include <iostream> 2 #include <list> 3 4 using namespa ...

随机推荐

  1. 洛谷 P2515 [HAOI2010]软件安装

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  2. Uniform Resource Identifier

    https://en.wikipedia.org/wiki/Uniform_Resource_Identifier   "URI" redirects here. For othe ...

  3. js生成随机的uuid

    function generateUUID() { var d = new Date().getTime(); if(window.performance && typeof wind ...

  4. project .mpp 查看当天工作任务 1.选择自己 2.选择起始和终止时间 就显示当天的任务了

    project .mpp 查看当天工作任务 1.选择自己 2.选择起始和终止时间 就显示当天的任务了

  5. easyui实现增删改查

    陈旧的开发模式 美工(ui工程师:出一个项目模型) java工程师:将原有的html转成jsp,动态展示数据 缺点: 客户需要调节前端的展示效果 解决:由美工去重新排版,重新选色. 前后端分离: 前端 ...

  6. DedeCMS文章标题长度最全修改方法

    有时候DedeCMS首页或者其他页面不能全部展示文章标题,造成读者阅读体验差.一般来说标题精简.概括性强.有本文关键词就是一个好标题.写软文不比写“作文”,也不是论坛的标题党,软文是用来做排名的,主要 ...

  7. SQL使用exists时的多种写法

    from test; go from test; go 下面这种效率明显高不少.

  8. Caused by: java.lang.IllegalArgumentException: Parameter Maps collection does not contain value for com.bj186.crm.pojo.User

    原因分析: myBatis在写delete语句的时候,多写了一个属性 错误的代码: <delete id="deleteUser" parameterType="I ...

  9. C++函数形参为指针和指针引用的区别

    区别: 1.指针传参被调用函数的指针变量在栈内存中重新申请内存. 2.指针引用传参被调用函数的指针变量与调用函数的指针变量共用一块空间. // PointerCite.cpp : 定义控制台应用程序的 ...

  10. Git Bash Windows客户端乱码

    最近升级Git后,打开Git Bash出现了乱码,解决方法是: 注意,我升级之后,本地和字符集栏位出现了空白的情况.如果检查这里为空白,那么把本地设置为zn_CN,字符集设置为UTF-8