美文网首页
定值划分单链表

定值划分单链表

作者: 掌灬纹 | 来源:发表于2019-04-06 18:19 被阅读0次

源自CC150一书,原题描述为 定值x将单链表划分为两部分,左侧都小于x,右侧都大于等于x给定链表的头指针,x;返回划分后的头指针
注意:分割后原来数据顺序不变,且不开辟新空间,即不创建新结点

思路:遍历原链表,四指针划分链表,两两指针划分左右侧链表,在相连,即左侧由两个指针划分结点值都小于x,同理右侧都大于等于x
为方便更好观察链表变化打印了前后两个链表,函数返回值还是按要求返回一个头结点
例:
5->6->3->2->1->null, 3为划分
结果为2->1->5->6->3->null
Java代码描述

public class _04定值划分单链表 {
    public static void main(String[] args) {
        int[] arr = {5, 6, 3, 2, 1};
        Node head = new Node(0);
        Node p = head;
        for (int i = 0; i < arr.length; i++) {
            p.next = new Node(arr[i]);
            p = p.next;
        }
        print(head);
        Node p_head = paration(head, 3);
        print(p_head);

    }
    
    private static Node paration(Node head, int x) {
        Node p = head;
        Node rightBegin = null;
        Node rightEnd = null;
        Node leftBegin = null;
        Node leftEnd = null;
        while(p != null) {
            int pdata = p.data;
            if(pdata < x) {
                if(leftEnd == null) {//左侧第一个元素添加
                    leftBegin = p;
                    leftEnd = p;
                }else {
                    leftEnd.next = p;
                    leftEnd = leftEnd.next;//每次指向最尾
                }
            }else {//右侧
                if(rightEnd == null) {
                    rightBegin = p;
                    rightEnd = p;
                }else {
                    rightEnd.next = p;
                    rightEnd = rightEnd.next;
                }
            }
            p = p.next;
        }
        if(leftBegin == null)//没有比目标值小的元素
            return rightBegin;
        
        leftEnd.next = rightBegin;
        rightEnd.next = null;//清尾操作
        
        return leftBegin;
    }

    private static void print(Node head) {
        Node p = head.next;
        while(p != null) {
            System.out.print(p.data + "->");
            p = p.next;
        }
        System.out.println("null");
        
    }

    private static class Node{
        int data;
        Node next;
        
        public Node(int data) {
            super();
            this.data = data;
        }
        
    }

}

相关文章

  • 定值划分单链表

    源自CC150一书,原题描述为 定值x将单链表划分为两部分,左侧都小于x,右侧都大于等于x给定链表的头指针,x;返...

  • 1.单链表常用操作

    1.删除单链表中的指定节点 2.删除单链表中指定值的节点 (1). 利用栈删除单链表指定值的节点 (2). 用普通...

  • 线性表最值问题

    找最小值 找最大值 顺序表求最大值 顺序表求最小值 带头结点单链表求最大值 带头结点单链表求最小值 q是 最大值/...

  • chap2 线性表-链表

    链表 1. 递归算法,删除不带头节点的单链表中所有值为x的点 2 . 带有头结点的单链表,删除所有值满足特定条件的...

  • 链表(上:链表反转)

    1. 逆序打印链表(单链表) 给定单链表,从尾到头打印每个节点的值,不同的值之间用空格隔开。比如:1>2>3>4>...

  • swift 单链表操作 双链表操作

    单链表 尾插法 头插法 输入值删除节点 单链表反转 输入指点数 比此小的在左边 大的在右边 双链表 (不循环) 尾...

  • LintCode 练习代码

    35.翻转链表 165. 合并两个排序链表 96. 链表划分 166. 链表倒数第n个节点 java语言一次循环定...

  • 027-Remove Duplicates from Sorte

    描述 在一个排序单链表中,删除节点值重复出现的节点,保证每个节点的值只出现一次。 分析 单链表中可以访问到当前节点...

  • 王道数据结构 第二章 线性表(3) 编程题上半部分

    设计一个递归算法,删除不带头结点的单链表L中的所有值为x的结点。 在带头结点的单链表L中,删除所有值为x的结点,并...

  • 链表划分

    描述给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。 你应该保留两部分内链表节点原有...

网友评论

      本文标题:定值划分单链表

      本文链接:https://www.haomeiwen.com/subject/qmtdiqtx.html