首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[Day13]] 2022-03-10 86. 分隔链表

[Day13]] 2022-03-10 86. 分隔链表

作者头像
早起的鸟儿有虫吃
发布2022-04-19 11:58:06
发布2022-04-19 11:58:06
2950
举报
文章被收录于专栏:算法之美算法之美

前言

链表的特点 适合 插入和 删除 一个元素,不需要整体移动。

go代码

代码语言:javascript
复制
/**
* Definition for singly-linked list.
* type ListNode struct {
*     Val int
*     Next *ListNode
* }
    86. 分隔链表
 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔
 你应当 保留 两个分区中每个节点的初始相对位置。


*/
func partition(head *ListNode, x int) *ListNode {

 //01 合法性检查
 if nil == head || nil == head.Next {
  return head
 }

 //02 固定头节点插入
 //case1 x=1 input=【1,2,3,4,5】 都比1大,位置保持不变。
 //case2 x=5 input=【1,2,3,4,5】 都比5小,位置保持不变。
 //case3 X =5  INPUT=【6,5,4,3,2,1】 都比5小,需要翻转。

 //比x小有2个情况,需要翻转(这里需要固定头节点),不需要翻转。
 dummnyhead := ListNode{
  Val:  -1,
  Next: head,
 }

 //03 定义三路指针
 ptail := &dummnyhead //排序后小于元素x的最后一个位置。
 pcur := head
 ppre := ptail

 //04 链表的遍历

 for pcur != nil {
  if pcur.Val >= x {
   //case1 x=1 input=【1,2,3,4,5】 都比1大,位置保持不变。
   ppre = pcur
   pcur = pcur.Next
  } else if ptail.Next == pcur {
   //case2 x=5 input=【1,2,3,4,5】 都比5小,位置保持不变。
   ptail = pcur
   ppre = pcur
   pcur = pcur.Next
   //对同一个位置 不需要翻转
  } else {

   //一个元素把链表 分割成为2部分,全部大于 x,全部小于 x case1 和case2 是理想情况
   //case3 X =5  INPUT=【6,5,4,3,2,1】 都比5小,需要翻转。

   ppre.Next = pcur.Next  //删除
   pcur.Next = ptail.Next //链表尾节点插入
   ptail.Next = pcur      //链表尾节点插入
   ptail = pcur           // 小于x的最后一个位置。

   pcur = ppre.Next //

  }

 }
 return dummnyhead.Next
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

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

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

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