《程序员面试金典》--分割链表
2015-09-21 20:37
253 查看
题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
题目分析:
要是链表换作数组要特别小心,因为搬迁数组要涉及到移动元素的开销,而移动链表的元素则容易很多,我们不需要移动和交换链表中的元素,只是改变一下每个节点的next指针就可以,我们可以创建两个链表,一个链表是存放小于x的元素,另一个链表存放大于等于x的元素,然后遍历一遍原有链表,将小于x元素的节点加到第一个链表上,将大于等于x元素的节点加到第二个链表上。便可实现分割。
程序代码如下:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
题目分析:
要是链表换作数组要特别小心,因为搬迁数组要涉及到移动元素的开销,而移动链表的元素则容易很多,我们不需要移动和交换链表中的元素,只是改变一下每个节点的next指针就可以,我们可以创建两个链表,一个链表是存放小于x的元素,另一个链表存放大于等于x的元素,然后遍历一遍原有链表,将小于x元素的节点加到第一个链表上,将大于等于x元素的节点加到第二个链表上。便可实现分割。
程序代码如下:
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Partition { public: ListNode* partition(ListNode* pHead, int x) { // write code here ListNode* beforeStart=NULL; ListNode* beforeEnd=NULL; ListNode* afterstart=NULL,*afterEnd=NULL; ListNode* headval; while(pHead) { headval=pHead->next; if(pHead->val<x) { if(beforeEnd==NULL) beforeEnd=beforeStart=pHead; else { beforeEnd->next=pHead; beforeEnd=pHead; } } else { if(afterstart==NULL) { afterstart=afterEnd=pHead; } else { afterEnd->next=pHead; afterEnd=pHead; } } pHead=headval; } if(afterEnd) afterEnd->next=NULL; if(beforeEnd!=NULL) beforeEnd->next=afterstart; else beforeStart=afterstart; return beforeStart; } };
相关文章推荐
- leetcode之Add Digits
- 牛客堂常见面试题精讲(一)3
- 面试笔试题记录
- 《剑指Offer》面试题:实现O(1)获取min的栈
- 程序员面试总结
- 设计一个getMin功能的栈,如果面试官让你写一个数组类,一定不要用指针去管理new出来原生的数组,那就是在给自己挖坑
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
- java面试题集锦5
- java面试题集锦4
- java面试题集锦3
- java面试集锦2
- java面试题集锦1
- 面试中对于排序操作的考察
- 怎样才是理想的程序员
- 女屌丝的程序员生涯(二)
- iOS 面试大全从简单到复杂(简单篇)
- 面试---x&(x-1);
- 黑马程序员——面向对象
- Java面试宝典
- 黑马程序员---错误收集