程序员面试经典--链表分割
来源:互联网 发布:淘宝店家论坛 编辑:程序博客网 时间: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
- 程序员面试经典之链表分割
- 程序员面试经典--链表分割
- 《程序员面试金典》链表分割
- 《程序员面试金典》--分割链表
- 【程序员面试金典】链表分割
- [程序员面试金典]-链表分割
- 回文链表之程序员面试经典
- 程序员面试经典--链表节点查找
- 程序员面试经典--链表回文判断
- 程序员面试金典 2.4 链表分割
- 程序员面试金典题解 链表分割
- 程序员面试金典——链表分割
- 链表的几个经典问题-读《程序员面试攻略》
- 程序员面试经典--删除链表重复节点
- 程序员面试经典--创建二叉树层结点链表
- 程序员面试经典源代码
- 程序员面试经典--字串
- 程序员面试经典--汉诺塔
- js
- 随机失活 dropout直观理解
- PHP Class中public,private,protected,static的区别
- DFS
- 数据库练习题笔记
- 程序员面试经典--链表分割
- Linux认证失败问题解决
- TCP/IP(7)-TCP Server与TCP Client(linux套接字)
- Oracle入门
- [网络流24题]骑士共存问题
- Leetcode-557. Reverse Words in a String III
- iTerm2文件夹显示颜色
- DP —> 背包问题
- 使用ReentrantLock实现线程同步