链表分割。牛客网

题目:

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

思路:
创建两个新链表,将原来的链表的值和x进行比较,比x小的采用尾插法插入到新链表1中,比x大的也采用尾插法插入到新链表2中,比较完原链表所有的节点后,将链表1和链表2拼接在一起。链表1在前,链表2在后。

具体代码实现如下:

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        if (pHead == null) {
        	//原链表是否为null
            return null;
        } else if (pHead.next == null) {
        	//原链表只有一个节点
            return pHead;
        }
        ListNode smallHead = new ListNode(0);
        ListNode small = smallHead;
        ListNode largeHead = new ListNode(0);
        ListNode large = largeHead;
        while (pHead != null) {
            if (pHead.val < x) {
                small.next = pHead;
                small = small.next;
            } else {
                large.next = pHead;
                large = large.next;
            }
            pHead = pHead.next;
        }
        
        //如果large的最后一个节点不是原节点的最后一个,那么就会成环
        //所以要将保存大值的链表末尾置为null
        large.next = null;
        //合并两个链表
        small.next = largeHead.next;
        return smallHead.next;
    }
}

测试结果如下:
在这里插入图片描述

发布了140 篇原创文章 · 获赞 16 · 访问量 8683

猜你喜欢

转载自blog.csdn.net/Huwence/article/details/102095055