前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员面试金典 - 面试题 02.04. 分割链表

程序员面试金典 - 面试题 02.04. 分割链表

作者头像
Michael阿明
发布2020-07-13 17:21:14
3610
发布2020-07-13 17:21:14
举报

1. 题目

编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。

代码语言:javascript
复制
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-list-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 题目意思:将小于x的节点放在x前部
  • partTail是满足上面要求的部分的尾巴
  • 建立空头节点哨兵,用head遍历,prev记录前置节点
代码语言:javascript
复制
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
    	ListNode *emptyHead = new ListNode(-1), *prev, *partTail;
    	emptyHead->next = head;
    	partTail = prev = emptyHead;
    	while(head)
    	{
    		if(head->val < x && partTail != prev)//注意第二个条件
    		{
    			prev->next = prev->next->next;//把head断开
    			head->next = partTail->next;//head接入小于x的段
    			partTail->next = head;//head接上前段尾巴
    			partTail = partTail->next;//更新尾巴,这句也可以不要
    			//不要的话,就是partTail其实是头,不变,一直往头上插入节点
    			head = prev->next;//更新head
    		}
    		else	//其他情况直接后移
    		{
    			prev = head;
    			head = head->next;
    		}
    	}
    	return emptyHead->next;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档