【数据结构】C语言算法练习题——通过 “ 创建俩个链表与尾插操作 ” 去解决

该博客主要讲解了一种链表分割的解题思路,通过创建两个哨兵节点的链表,根据节点值与给定值x的大小关系进行尾插操作,保持原有顺序。在处理过程中需要注意避免尾插后形成的环状结构导致错误。提供的参考代码实现了这一算法,可用于处理链表数据结构的问题。
摘要由CSDN通过智能技术生成

题目链接:

链表分割_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

解题思路:

1. 要注意其与 x 的值进行比较后的这些数字的相对顺序不能改变,所以不能用 “ 逐步头插 ” 去解决

2. 思路:

新建俩个带哨兵位的链表,比 x 值大的数字通过 “ 尾插 ” 操作放在第一个链表中,比 x 值小的数字通过 “ 尾插 ” 操作放在第二个链表中

最后把这俩个链表连接起来,然后分别把头结点释放

尾插操作不会改变其数字间的相对顺序

3. 注意:

如果尾插到最后一个结点被放在其中一个链表中,而这个结点中的指针域没有被置为 NULL 那么此

时会形成环结构,造成使用用例出错。如下图:

参考代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x)
    {
        struct ListNode *bighead,*bigtail,*smallhead,*smalltail;
        smallhead = smalltail = (struct ListNode*)malloc(sizeof(struct ListNode));
        bighead = bigtail = (struct ListNode*)malloc(sizeof(struct ListNode));
        
        //bigtail = smalltail = NULL;
        //对哨兵位里的指针域进行初始化
        bigtail->next = NULL;
        smalltail->next = NULL;
        
        struct ListNode *cur = pHead;
        while (cur)
        {
            if ((cur->val) < x)
            {
                smalltail->next = cur;
                smalltail = smalltail->next;           
            }
            else
            {
                bigtail->next = cur;
                bigtail = bigtail->next;
            }
            cur = cur->next;
        }
        
        bigtail->next = NULL;
        smalltail->next = bighead->next;
        struct ListNode *list = smallhead->next;
        free(smallhead);
        free(bighead);
        return list;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值