链表例题3:用基准值将链表分区

解题思路:

1.创建一个结点类。

2.创建一个分割方法。

3.声明四个结点分别存储小于基准值,大于或等于基准值(注意这里是声明结点,不是实例化结点,所以不算违规)。

四个声明的结点为(定义四个结点是为了最后好进行链接在一起):

1.LHead,LTail用来存储小于基准值的。

2.RHead,RTail用来存储大于或等于基准值的。

假如链表如图:

代码如下:

 1 public class PartitionLinkNode {
 2
 3     public static void main(String[] args) {
 4         int number[]= {5,6,3,2,1};
 5         ListNode head=new ListNode();
 6         ListNode p=head;
 7         //数组数据用链表的方式串连
 8         for(int i=0;i<number.length;i++)
 9         {
10             p.data=number[i];
11             if(!(i+1==number.length))
12             p=p.next=new ListNode();
13         }
14
15         ListNode head2=Partition(head,3);
16         ListNode p2=head2;
17         //遍历输出
18         while(p2!=null)
19         {
20             System.out.print(p2.data+" ");
21             p2=p2.next;
22         }
23
24     }
25
26     public static ListNode Partition(ListNode pHead,int n) {
27         ListNode p=pHead;
28         ListNode LHead=null; //小于基准数的头结点
29         ListNode LTail=null; //小于基准数的尾结点
30         ListNode RHead=null; //大于或等于基准数的头结点
31         ListNode RTail=null; //大于或等于基准数的尾结点
32         while(p!=null)
33         {
34             int pValue=p.data;
35             if(pValue<n)
36             {
37                 if(LHead==null)
38                 {
39                     LHead=LTail=p;
40                 }else
41                 {
42                     LTail.next=p;
43                     LTail=LTail.next;
44                 }
45             }else {
46                 if(RHead==null)
47                 {
48                     RHead=RTail=p;
49                 }else
50                 {
51                     RTail.next=p;
52                     RTail=RTail.next;
53                 }
54
55             }
56             p=p.next;
57         }
58
59         if(LHead==null)
60         {
61             RTail.next=null;
62             return RHead;
63         }else {
64             LTail.next=RHead;
65             RTail.next=null; //注意这里需要让RTail的next为空,不然会无限循环
66         }
67         return LHead;
68
69     }
70 }
71     //结点类
72     class ListNode {
73         int data;
74         ListNode next;
75
76         public ListNode() {}
77         public ListNode(int data)
78         {
79             this.data=data;
80         }
81     }

结果:

原文地址:https://www.cnblogs.com/LgxBoKeYuan/p/10203081.html

时间: 2024-11-04 18:49:26

链表例题3:用基准值将链表分区的相关文章

单链表的节点内数据值的删除问题(携程网笔试题)

问题描述:给定一个单链表,链表中存储的数据都为整数,给定一个整数x,将单链表中所有与x相等的元素删除. 例如:单链表为(1,2,3,4,2,4),x=2,则删除节点后链表为(1,3,4,4) 分析:这是链表的基本操作问题,具体的Java代码如下: 1 import java.util.*; 2 class Node{ //链表节点的结构 3 int data; 4 Node next=null; 5 } 6 7 public class Main { 8 public static void c

【每日算法】链表 &amp; 例题选讲

单链表 链表是常用的数据结构,其优点是插入和删除元素时不需要移动,表的容量可扩充,且存储空间可以不连续. 另外,由于涉及到指针,所以很受面试官的青睐. 本文将主要介绍单链表,并简单介绍下双链表和环形链表,并通过一系列的题目来强化这方面的知识. 链表节点的结构: template<class DataType> struct Node { DataType data; Node<DataType> *next; }; data存放节点的数据,next指向下一个节点. 对于单链表,需要

链表《2》使用函数操作链表

使用函数操作链表 1:计算链表中结点的个数:定义一个Length_list()函数用于计算链表中结点的个数 函数代码: //计算链表中结点的个数 void Length_list(PNODE pHead) { PNODE p = pHead->pNext; int len = 0; while(NULL != p) { len++; p = p->pNext; } printf("这条链表中有%d个结点\n",len); } 2判断链表是否为空:定义一个Is_empty()

【剑指Offer】【链表】合并两个排序的链表

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead1   创建ret_Head作为合并链表的新头结点,比较pHead1和pHead2,ret_Head指向小的数,ret_Head->next指向两个链表中下一个最小的数 ====> 递归 A:同样的,递归也是一种栈结构,所以也可以用栈来解决这个问题 /* struct ListNode { int

【OJ】【Leetcode】【链表】【双指针】160. 相交链表

题目 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0).从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点.链表结点定义如下: struct ListNode { int       m_nKey; ListNode* m_pNext; }; c语言实现 /* File : rlink.c Author : Date : 2015/4/4 platform : windows7 x86_64 version : 1.0 Function : 反转一个链表 */ #include <stdio.h> #include <stdli

电机系统标幺值基准值的选取

电机系统标幺化的好处: 对于不同功率.电压值的设备标幺值在一定范围内,具有可比性,而测量值则随之变化: 定点DSP控制:可有效防止数据溢出. 各个基值的选取方式如下: 电机系统标幺值基准值的选取,布布扣,bubuko.com

【练习题】编写打印出一个单链表的所有元素的程序【链表】

只是实现了链表ADT的部分功能. /*---编写打印出一个单链表的所有元素的程序---*/ #include <stdio.h> #include <stdlib.h> struct Node{ int val; struct Node *next; }; Node *findEnd(Node *list){ while(list->next) list = list->next; return list; } void insert(int val, Node *li

&lt;笔试&gt;&lt;面试&gt;C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)

判断两链表是否相交,求交点(假设链表不带环) 判断两链表是否相交,求交点(假设链表可能带环) RingEntry_Point()等函数见前篇. SListNode* Intersect(SListNode *&L, SListNode *&M)//判断两链表是否相交,求交点(假设链表不带环) {  //思路:若不带环,只有相交/不想交两种情况  // 与RingEntry_Point()函数方法相同:  //     求两个链表长度之差K,再令一个指针从长链表开始先走K步,令另一个指针从短