[链表]

来源:互联网 发布:明代宗 知乎 编辑:程序博客网 时间:2024/06/11 04:43
题目:
给定一个单向链表的头结点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;}


原创粉丝点击