2021-01-03 86.分隔链表

86. 分隔链表

这里我们采用手动模拟的方法,我们称输入的链表为主链。
利用两条链表,一条存储比x严格小的元素,另一条存储大于等于x的元素。
每次利用tmp到达一个新的ListNode,判断这个节点所属类别。以small为例:

// small 每次指向small链条中最后一个元素
small.next = tmp; //更新最后一个元素
tmp = tmp.next;  //主链往后移动一个位置
small = small.next; //将small移动到最后一个元素
small.next = null;  //将small的next与主链断开
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
	// 用于打印出这个节点所有内容从而进行调试
    public void printNode(ListNode l){
    
    
        while(l!=null){
    
    
            System.out.print(l.val+" ");
            l = l.next;
        }
        System.out.print("\n");
    }
    
    public ListNode partition(ListNode head, int x) {
    
    
        // small 用于存储<x的元素,big来存储>=x的元素,这两个指针始终指向最后一个元素(方便添加新的元素)
        
        ListNode small = new ListNode(0);
        ListNode big = new ListNode(0);
        ListNode smallhead = small;
        ListNode bighead = big;
        ListNode tmp = head;

        while(tmp!=null){
    
    
            if(tmp.val<x){
    
    
                small.next = tmp;
                tmp = tmp.next;
                small = small.next;
                small.next = null;
            }
            else
            {
    
       
                big.next = tmp;
                tmp = tmp.next;
                big = big.next;
                big.next = null;
            }
        }
        small.next = bighead.next; //因为small是small里面最后一个元素
        return smallhead.next;
    }
}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44495738/article/details/112149794
今日推荐