程序员面试经典--链表分割

来源:互联网 发布:淘宝店家论坛 编辑:程序博客网 时间:2024/05/16 15:59

2.4问题:

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排列在大于或等于x的结点之前。

思考:可以直接创建两个链表,一个链表存放小于x的元素,另一个链表存放大于或等于x的元素。迭代访问整个链表之后,合并两个链表即可。

import java.util.*;//节点类class Node {protected Node next; //指针域protected int data;//数据域 public Node( int data) {this.data = data;} //显示此节点public void display() {System. out.print( data + " ");}}//单链表class LinkList {public Node first; // 定义一个头结点private int pos = 0;// 节点的位置public LinkList() {this.first = null;//this代表当前类}// 插入一个头节点public void addFirstNode( int data) {Node node = new Node(data);node. next = first;first = node;}// 删除一个头结点,并返回头结点public Node deleteFirstNode() {Node tempNode = first;first = tempNode. next;return tempNode;}// 在任意位置插入节点 在index的后面插入public void add(int index, int data) {Node node = new Node(data);Node current = first;Node previous = first;while ( pos != index) {previous = current;current = current. next;pos++;}node. next = current;previous. next = node;pos = 0;}// 删除任意位置的节点public Node deleteByPos( int index) {Node current = first;Node previous = first;while ( pos != index) {pos++;previous = current;current = current. next;}if(current == first) {first = first. next;} else {pos = 0;previous. next = current. next;}return current;}// 根据节点的data删除节点(仅仅删除第一个)public Node deleteByData( int data) {Node current = first;Node previous = first; //记住上一个节点while (current. data != data) {if (current. next == null) {return null;  }previous = current;current = current. next;}if(current == first) {first = first. next;} else {previous. next = current. next;}return current;}// 显示出所有的节点信息public void displayAllNodes() {Node current = first;while (current != null) {current.display();current = current. next;}System. out.println();}// 根据位置查找节点信息public Node findByPos( int index) {Node current = first;while( pos != index) {current = current. next;pos++;}pos = 0;return current;}// 根据数据查找节点信息public Node findByData( int data) {Node current = first;while (current. data != data) {   if (current. next == null)return null;current = current. next;}return current;}}class partition{public static void main(String args[]){LinkList linkList = new LinkList();linkList.addFirstNode(19);//19linkList.addFirstNode(18);//18,19linkList.addFirstNode(20);//20,18,19linkList.add(1, 16); //20,16,18,19linkList.add(2, 17); //20,16,17,18,19linkList.add(3, 17); //20,16,17,17,18,19linkList.displayAllNodes();Node node;node=partition(linkList.first,18);linkList.first=node;linkList.displayAllNodes();}public static Node partition(Node node,int x){Node beforeStart = null;Node beforeEnd = null;Node afterStart = null;Node afterEnd = null;while(node != null){Node next = node.next;node.next=null;if(node.data<x){if(beforeStart==null){beforeStart=node;beforeEnd=beforeStart;}else{beforeEnd.next=node;beforeEnd=node;}}else{if(afterStart==null){afterStart=node;afterEnd=afterStart;}else{afterEnd.next=node;afterEnd=node;}}node=next;}if(beforeStart==null){return afterStart;}beforeEnd.next=afterStart;return beforeStart;}}

方法二:

前一种方法需要维护四个变量,有些碍眼,这个方法只需维护两个变量。结点不再追加至before和after链表的末端,而是插入这两个链表的前端。

class partition{public static void main(String args[]){LinkList linkList = new LinkList();linkList.addFirstNode(19);//19linkList.addFirstNode(18);//18,19linkList.addFirstNode(20);//20,18,19linkList.add(1, 16); //20,16,18,19linkList.add(2, 17); //20,16,17,18,19linkList.add(3, 17); //20,16,17,17,18,19linkList.displayAllNodes();Node node;node=partition(linkList.first,18);linkList.first=node;linkList.displayAllNodes();}public static Node partition(Node node,int x){Node beforeStart = null;Node afterStart = null;while(node != null){Node next = node.next;if(node.data<x){node.next=beforeStart;beforeStart=node;}else{node.next=afterStart;afterStart=node;}node=next;}if(beforeStart==null){return afterStart;}Node head =beforeStart;while(beforeStart.next!=null){beforeStart=beforeStart.next;}beforeStart.next=afterStart;return head;}}




0 0
原创粉丝点击