Partition List( LeetCode )

本文介绍了一种链表分区算法,该算法将链表中小于指定值x的所有节点置于大于或等于x的节点之前,同时保持原有相对顺序不变。通过实例演示了如何实现此功能。

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,

return 1->2->2->4->3->5.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        if( head == NULL || head -> next == NULL )	return head;<span style="white-space:pre">		</span>// case 1:链表为空或者只有一个元素,则直接返回
		ListNode *p = NULL,*q = head;
		ListNode *begin = NULL,*end = NULL,*inbegin = NULL,*inend = NULL;// begin,end 为第一个大于等于x的切割位点
		while( q != NULL )	{<span style="white-space:pre">					</span>//  inbegin,inend 为切割点之后所有小于x的元素的
			if( q -> val >= x )	{<span style="white-space:pre">				</span>// 首尾元素
				begin = p;
				end = q;
				break;
			}
			p = q;
			q = q -> next;
		}
		if( q == NULL || q -> next == NULL ) return head;<span style="white-space:pre">	</span>//case 2:不存在切割点或者切割点为最后一个元素,则无需改动
		int flag = 1;
		while( q != NULL )	{
			if( q -> val < x )	{
				p -> next = q -> next;
				if( flag )	{<span style="white-space:pre">			</span>// inbegin,inend 的赋值
					inbegin = q;
					inend = q;
					flag = 0;
					q = q -> next;
					continue;
				}
				inend -> next = q;
				inend = inend -> next;
				q = q -> next;
			}
			else {
			    p = q;
			    q = q -> next;
			}
		}
		if( inbegin == NULL )   return head;<span style="white-space:pre">		</span>//case 3:切割点后不存在小于x的点,直接返回
	    <span style="white-space:pre">	</span>else if( begin == NULL )	{<span style="white-space:pre">		</span>//case 4:切割点在head位置,则在head之前插入inbegin至inend的元素,
			inend -> next = end;<span style="white-space:pre">			</span>//返回inbegin
			return inbegin;
		}
		else	{<span style="white-space:pre">					</span>//case 5:切割点不在首部,且之后存在小于x的元素,则将inbegin至inend
			begin -> next = inbegin;<span style="white-space:pre">		</span>//之间的元素插入切割点,返回head
			inend -> next = end;
			return head;
		}
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值