带哨兵位的单链表之 链表分割

简介: 带哨兵位的单链表之 链表分割

认识

链表分为两种:带头结点的不带头结点的

之前我们学习了不带哨兵位的单链表,并实现了相关代码

现在我们认识一下带哨兵位头结点的单链表

plist指向带哨兵位的头结点

这个结点不存储有效数据

如果为空链表:

  • 不带头:plist指向NULL
  • 带头:plist指向head,一定不会指向NULL

优势

带哨兵位的单链表也有他自己的优势,我们用一道题来证明一下:

链表分割_牛客题霸_牛客网 (nowcoder.com)

题目描述:

题目分析

假设有下面这个链表,给定数字5

那么排序后就是这样,不改变原来是数据顺序

可以分割成两个链表,plist1和plist2,小于x的结点尾插到plist1,否则尾插到plist2

当链表的数据全部尾插结束后,将plist2头结点尾插到plist1,这个时候带哨兵位的头结点就非常有优势了

我们可以定义两个头结点head和head2,分别作为两个链表的哨兵位,再定义两个尾结点tail1和tail2方便两个链表的尾插,定义cur遍历链表,和x值做比较

代码示例

我们思路清晰了就可以写代码了:

认识
链表分为两种:带头结点的和不带头结点的
之前我们学习了不带哨兵位的单链表,并实现了相关代码
现在我们认识一下带哨兵位头结点的单链表:
plist指向带哨兵位的头结点
这个结点不存储有效数据
如果为空链表:
不带头:plist指向NULL
带头:plist指向head,一定不会指向NULL 
优势
带哨兵位的单链表也有他自己的优势,我们用一道题来证明一下:
 链表分割_牛客题霸_牛客网 (nowcoder.com)
题目描述:
题目分析 
假设有下面这个链表,给定数字5
那么排序后就是这样,不改变原来是数据顺序
可以分割成两个链表,plist1和plist2,小于x的结点尾插到plist1,否则尾插到plist2
当链表的数据全部尾插结束后,将plist2头结点尾插到plist1,这个时候带哨兵位的头结点就非常有优势了
我们可以定义两个头结点head和head2,分别作为两个链表的哨兵位,再定义两个尾结点tail1和tail2方便两个链表的尾插,定义cur遍历链表,和x值做比较
代码示例
我们思路清晰了就可以写代码了:
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstdlib>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* head1,* head2,* tail1,* tail2;
        head1=(struct ListNode*)malloc(sizeof(struct ListNode));
        head2=(struct ListNode*)malloc(sizeof(struct ListNode));
        tail1=head1;
        tail2=head2;
        struct ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                tail1->next=cur;
                tail1=tail1->next;
            }
            else
            {
                tail2->next=cur;
                tail2=tail2->next;
            }
            cur=cur->next;
        }
        tail1->next=head2->next;
        tail2->next=NULL;
        pHead=head1->next;
        free(head1);
        free(head2);
        return pHead;
    }
};
 由于该题只能用c++,但是我们可以完全按照C语言的语法规则写内部,最后就可以通过了;

由于该题只能用c++,但是我们可以完全按照C语言的语法规则写内部,最后就可以通过了;

相关文章
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
28 0
|
3月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
4月前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
94 4
|
5月前
【数据结构OJ题】链表分割
牛客题目——链表分割
34 0
【数据结构OJ题】链表分割
|
6月前
|
存储
链表入门(单链表讲)
链表入门(单链表讲)
链表入门(单链表讲)
|
5月前
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
33 0
|
7月前
|
存储 编译器
单链表与双链表实现
单链表与双链表实现
|
6月前
|
存储
【海贼王的数据航海】链表—单链表
【海贼王的数据航海】链表—单链表
34 0
|
7月前
|
算法
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
|
7月前
特殊链表(循环单链表,循环双链表,静态链表)
特殊链表(循环单链表,循环双链表,静态链表)
53 3