常见单链表题型(六)链表分割

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44759710/article/details/102614896

题目要求

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针
注意:分割以后保持原来的数据顺序不变

示例:
输入:1->9->8->3->6->5->10 x=7
输出:1->3->6->5->9->8->10

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

解题思路

方法:
将小于的数放入一个链表,大于等于的放入另一个链表,再进行合并

解题演示

输入:1->9->8->3->6->5->10 x=7
输出:1->3->6->5->9->8->10

过程显示:

  • 新建两个链表:small (存放小数),large (存放大数)
  • 遍历链表得 small 为 1->3->6->5
  • 遍历链表得 large 为 9->8->10
  • 最后合并两个链表得到新链表返回,即 1->3->6->5->9->8->10

解题代码

class Partition {
public:
	ListNode* partition(ListNode* pHead, int x) {
		ListNode* small = new ListNode(0);
		ListNode* large = new ListNode(0);
		ListNode* smallHead = small;
		ListNode* largeHead = large;
		while (pHead)
		{
			if (pHead->val < x)
			{
				small->next = pHead;
				small = small->next;
			}
			else
			{
				large->next = pHead;
				large = large->next;
			}
			pHead = pHead->next;
		}
		large->next = NULL;
		small->next = largeHead->next;
		return smallHead->next;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/102614896