学習目標:
目標:Javaで学んだ知識を上手に活用する
学習内容:
この記事の内容:Javaで実装:リンクリストの分割
タイトル説明:
xに基づいてリンクリストを分割するプログラムを作成し、x未満のすべてのノードがx以上のノードの前にランク付けされるようにします。リンクリストにxが含まれている場合、xはx未満の要素の後にのみ表示する必要があります(以下を参照)。分割要素xは「右半分」にある必要があり、左右の部分の間に配置する必要はありません。
例:
入力:ヘッド= 3-> 5-> 8-> 5-> 10-> 2-> 1、x = 5
出力:3-> 1-> 2-> 10-> 5-> 5-> 8
問題解決のアイデア
2つの新しいリンクリストを作成します。1つは指定された値よりも小さいノードを格納し、もう1つは指定された値よりも大きいノードを格納し、最後に2つのリンクリストを接続します。
- まず、リンクリストが空で、ノードが1つしかない状況を特定します。
if(head==null)return null;//为空链表
if(head.next==null) return head;//只有一个节点
- 2つの新しいリンクリストを作成します
ListNode min =new ListNode(0);//创建小于给定值的链表
ListNode minTail=min;
ListNode max=new ListNode(0);//创建大于给定值的链表
ListNode maxTail=max;
ListNode cur=head;
- 循環比較により、対応するノードは対応するリンクリストに保存され、リンクリストは一緒にスプライスされます
//比较链表节点与给定值并存入相应链表
while(cur!=null){
if(cur.val<x){
minTail.next=new ListNode(cur.val);//后插入链表
minTail=minTail.next;
}else{
maxTail.next=new ListNode(cur.val);//后插入链表
maxTail=maxTail.next;
}
cur=cur.next;
}
minTail.next=max.next;//将两个链表拼接起来
実装コード
public static ListNode partition(ListNode head, int x) {
if(head==null)return null;//为空链表
if(head.next==null) return head;//只有一个节点
ListNode min =new ListNode(0);//创建小于给定值的链表
ListNode minTail=min;
ListNode max=new ListNode(0);//创建大于给定值的链表
ListNode maxTail=max;
ListNode cur=head;
//比较链表节点与给定值并存入相应链表
while(cur!=null){
if(cur.val<x){
minTail.next=new ListNode(cur.val);//后插入链表
minTail=minTail.next;
}else{
maxTail.next=new ListNode(cur.val);//后插入链表
maxTail=maxTail.next;
}
cur=cur.next;
}
minTail.next=max.next;//将两个链表拼接起来
return min.next;
}