前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day3-线性表-链表划分,保持相对位置

Day3-线性表-链表划分,保持相对位置

作者头像
BUPTrenyi
发布2019-07-16 11:38:18
4030
发布2019-07-16 11:38:18
举报

一 今天不废话,直接上题

今天吃饭晚了点,导致盒饭迟到了一会。

而吃饭晚的原因又是什么呢?因为今天开周会,大家聊得比较嗨。

那么大家到底聊了什么呢这么嗨?因为在复盘这周的一次线上事故,大家畅所欲言就聊嗨了。

那等下第二篇盒饭会讲这次复盘吗?当然会讲啦~

哎等下,你不是说不废话吗?

二 题目

Q:已知链表头指针及数X,将所有小于X的节点,放在大于等于X的节点前,且保持这些节点的原来的相对位置

那么问题来了,保持相对位置是什么意思?

答曰:如【1。。。2】最后的链表,1也要在2的左边,这叫保持相对位置

那么,冷静分析:

伟大的哲学家鲁迅曾经说过,链表问题,快慢指针,临时头节点,以及关键节点,就这仨思路

那么对于链表

1->4->3->2->5->2

来说,最终结果就应该是(保持相对位置)

1->2->2->4->3->5

那么,我建两个临时头节点,在遍历原链表的过程中

比X小的,插在小的临时头节点后面

比X大的,插在大的临时头节点后面

那么就是:

less_head->1->2->2

more_head->4->3->5

那么此时我只要完成2->more_head

两个链表不就连上了,就是最终结果了嘛

三 完整代码及注释

代码语言:javascript
复制
//
// Created by renyi on 2019/5/31.
//
#include <iostream>
using namespace std;

struct Node{
    int value;
    Node* next;
    Node(int v):value(v),next(NULL){}
};

Node* separateList(Node* head, int x){
    Node less_head(0);//创建两个临时头节点
    Node more_head(0);

    Node* less = &less_head;//对应指针指向这两个临时头节点
    Node* more = &more_head;

    while(head){
        if (head->value < x){//若节点值小于x,应插到less_head后面
            less->next = head;
            less = head;//链接完节点以后,应该将less后移,指向head
        } else{
            more->next = head;//若节点值大于x,应插到more_head后面
            more = head;//链接完节点以后,应该将less后移,指向head
        }
        head = head->next;
    }
    less->next = more_head.next;//此时less指针的后继应指向,more_head头节点的后继,即more_head部分第一个节点
    more->next = NULL;//此时more指针遍历到链表尾,后继置空
    return less_head.next;
}

void print(Node* head){//对比第一天的print函数,改进了一下
    while(head){
        if (head->next){
            cout<<head->value<<"->";
        } else{
            cout<<head->value;
        }
        head = head->next;
    }
    cout<<endl;
}

int main(){
    Node a(1);
    Node b(6);
    Node c(2);
    Node d(7);
    Node e(10);
    Node f(3);
    Node g(4);
    Node h(9);
    a.next = &b;
    b.next = &c;
    c.next = &d;
    d.next = &e;
    e.next = &f;
    f.next = &g;
    g.next = &h;

    Node* head = separateList(&a, 5);
    print(head);
    return 0;
}

最终结果就是

四 总结一哈

线性表中的,初级链表问题,明天再更一篇就结束了,就开始字符串的讲解了。

全部目录进行完一遍之后,我会再从链表开始,进行链表难题的讲解,还请大家持续关注呀~

还是要多练,多总结,多动手码,你就会发现

哎不好意思,放错图了

惊不惊喜意不意外

祝大家永远保持童心,儿童节快乐~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法其实很好玩 微信公众号,前往查看

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

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

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