链表的分化

对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。
给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。

测试样例:
{1,4,2,5},3
{1,2,4,5}

思路:

在遍历链表的过程中,对链表进行拆分,分为小于等于val的链表list1和大于val的链表list2.这里采用哨兵节点代表两个链表的头结点,省却很多判断.
特别要注意的是,要将list2尾节点的next域置为null,避免出现环.例如{1,4,2},3.拆分为两个链表后是1->2和4->2.合并之后会变成1->2<=>4,2和4成环.

import java.util.*;

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Divide {
    public ListNode listDivide(ListNode head, int val) {
        ListNode guard = new ListNode(0);
        guard.next = head;
        ListNode runner = guard;

        ListNode guard2 = new ListNode(0);
        ListNode runner2 = guard2;

        while (runner.next != null) {
            if (runner.next.val > val) {
                runner2.next = runner.next;
                runner2 = runner2.next;
                runner.next = runner.next.next;            
            } else {
                runner = runner.next;
            }
        }
        runner2.next=null;    //一定要将大链表的尾节点的next置为null
        runner.next = guard2.next;
        return guard.next;
       
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保...
    X_Y阅读 1,501评论 0 0
  • 对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于这个值的结点移到前面,等于的值在中间,大于该值的结点在...
    熊白白阅读 1,176评论 0 0
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,568评论 0 25
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,705评论 0 16
  • 链表的基本操作 定义 从链表头部插入元素 从链表头部删除元素 从链表尾部插入元素 从中间插入和删除结点 栈和对列的...
    gskobe0811阅读 3,214评论 0 2