题目:
给定一个单向链表的头结点head,节点的值类型时整型,再给定一个整数pivot
实现一个调整链表的函数,将链表调整为左部分都是小于pivot的节点,中间部分
都是值等于pivot的节点,右边部分都是大于pivot的节点,出这个要求外,对调整后的
节点顺序没有更多的要求
进阶:
-在原问题的要求智商再增加如下两个要求:
在左中右三个部分的内部也做顺序要求,要求每部分的节点从左到右顺序与
原链表中节点的先后顺序一致。
给定一个单向链表的头结点head,节点的值类型时整型,再给定一个整数pivot
实现一个调整链表的函数,将链表调整为左部分都是小于pivot的节点,中间部分
都是值等于pivot的节点,右边部分都是大于pivot的节点,出这个要求外,对调整后的
节点顺序没有更多的要求
进阶:
-在原问题的要求智商再增加如下两个要求:
在左中右三个部分的内部也做顺序要求,要求每部分的节点从左到右顺序与
原链表中节点的先后顺序一致。
-如果链表长度为N,时间复杂度达到O(N),额外空间复杂度请达到O(1)
public class Node{ public int value; public Node next; public Node(int dta){ this.value = data; } } public Node listPartition1(Node head,int pivot){ if (head == null){ return head; } Node cur = head; int i = 0; while(cur != null){ i++; cur = cur.next; } Node[] nodeArr = new Node[i]; i = 0; cur = head; for(i = 0;i != nodeArr.length;i++){ nodeArr[i] = cur; cur = cur.next; } arrPartition(nodeArr,pivot); for(i = 1;i != nodeArr.length; i++){ nodeArr[i -1].next = nodeArr[i]; } nodeArr[i-1].next = null; return nodeArr[0]; } public void arrPartition(Node[] nodeArr,int pivot){ int small = -1; int big = nodeArr.length; int indedx = 0; while(index != big){ if(nodeArr[index].value < pivot){ swap(nodeArr,++small,index++); }else if (nodeArr[index].value == pivot){ index ++; }else{ swap(nodeArr,--big,index); } } } public void swap(Node[] nodeArr, int a, int b){ Node tmp = nodeArr[a]; nodeArr[a] = nodeArr[b]; nodeArr[b] = tmp; }