【每日一题】牛客网——链表分割

简介: 【每日一题】牛客网——链表分割


1. 题目描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

题目链接


2. 思路

  1. 判断链表是否为空,如果为空返回null
  2. 定于指针cur指向头节点,即链表的头节点
  3. 定义指针bsbe,分别指向小于x链表的头节点和尾节点
  4. 定义指针asae,分别指向大于等于x链表的头节点和尾节点

循环遍历链表,直到遍历完所有的节点

如果当前节点的val值小于x


判断小于x的链表中是否为空,如果为空则bs和be都指向当前节点


否则be的next指向当前节点,be指向be的next


当前节点的val值大于等于x


判断大于等于x的链表中是否为空,如果为空则as和ae都指向当前节点


否则ae的next指向当前节点,ae指向ae的next


cur指向cur的next

  1. 如果小于x的链表为空,则返回as
  2. 否则benext指向as
  3. 如果as不为空,则将asnext值为空(原链表的最后一个节点的值小于x
  4. 返回bs



3. 代码

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        if (pHead == null) {
            return null;
        }
        // write code here
        // 定义cur 指向头结点
        ListNode cur = pHead;

        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;

        while (cur != null) {
            if (cur.val < x) {
                if (bs == null) { // 判断是不是第一个元素
                    bs = cur;
                    be = cur;
                } else {
                    be.next = cur;
                    be = be.next;
                }
            } else {
                if (as == null) {
                    as = cur;
                    ae = cur;
                } else {
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
        }
        if (be == null) {
            return as;
        }
        be.next = as;
        if (as != null) {
            ae.next = null;
        }
        return bs;
    }
}

运行结果:



相关文章
|
7月前
面试题 02.04:分割链表
面试题 02.04:分割链表
56 0
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
30 0
|
5月前
【数据结构OJ题】链表分割
牛客题目——链表分割
34 0
【数据结构OJ题】链表分割
|
7月前
牛客—CM11 链表分割
牛客—CM11 链表分割
|
7月前
|
Java C++ Python
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
66 0
C/C++每日一练(20230422) 存在重复元素、组合总和、给表达式添加运算符
|
7月前
|
Python Java Go
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
49 0
Java每日一练(20230401) 合并K个升序链表、最长有效括号、分割回文串
|
7月前
Leecode之分割链表
Leecode之分割链表
LeetCode | 面试题 02.04. 分割链表
LeetCode | 面试题 02.04. 分割链表
|
7月前
牛客网:链表分割
牛客网:链表分割
43 0
面试题 02.04. 分割链表(LeetCode)
面试题 02.04. 分割链表(LeetCode)
面试题 02.04. 分割链表(LeetCode)