408算法练习——分隔链表

分割链表

原题链接https://leetcode-cn.com/problems/partition-list/

一、问题描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

 

示例 1:

408算法练习——分隔链表

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]


示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

    • 链表中节点的数目在范围 [0, 200] 内
    • -100 <= Node.val <= 100
    • -200 <= x <= 200

 

二、问题分析

  既然要保证链表中元素的相对位置,就不能简单的用排序实现,但是已经给出了x的值,所以可以遍历链表,当找到第一个大于x的结点时停止,然后把该结点后面所有比x小的结点都移动到该结点的前面,遍历完成后就得出了结果链表

 

三、算法及代码

  

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode partition(ListNode head, int x) {
13         if(head == null || head.next == null){
14             return head;
15         }
16         ListNode nhead = new ListNode();
17         nhead.next = head;
18         ListNode i = nhead;
19         while(i.next != null && i.next.val<x){//先把i固定
20             i = i.next;
21         }
22         if(i.next == null){//此时i是最后一个元素,说明序列已经符合要求
23             return head;
24         }else{
25             ListNode j = i.next;//让j从i开始遍历,找出所有小于x的结点
26             ListNode prej = i;//记录一个j的前趋结点用来移动元素
27             while(j != null){
28                 if(j.val < x){
29                     prej.next = j.next;
30                     j.next = i.next;
31                     i.next = j;
32                     i = j;
33                     j = prej.next;
34                    // prej = prej.next;
35                 }else{
36                     j = j.next;
37                     prej = prej.next;
38                 }
39             }
40         }
41         return nhead.next;        
42     }
43 }

 

上一篇:408每日算法——反转整数


下一篇:408算法练习——链表交并差