java实现链表及其相关操作
来源:互联网 发布:三国无双7捏脸数据 编辑:程序博客网 时间:2024/06/06 03:14
java实现链表及其相关操作 ,如下所示:
- 头插法
- 尾插法
- 遍历
- 倒置
- 在有序的链表中插入一个数还是有序
- 在有序的链表中删除一个数还是有序
- 合并两个有序列表
Node文件代码如下:
public class Node { Object data; Node next; public Object getData() { return data; } public void setData(int data) { this.data = data; } public Node() { // TODO Auto-generated constructor stub this.data = null; } public Node(int data) { // TODO Auto-generated constructor stub this.data = data; } /** * 头插法建立链表 * @param length 链表的长度,这里先设定初始长度 * @return 链表的头指针 */ public Node createListF(int length) { Node head,s; head = new Node(); head.next = null; for (int i=1; i<=length; i++) { s = new Node(i); s.next = head.next; head.next = s; } return head; } /** * 尾插法建立链表 * @param length 链表的长度,这里先设定初始长度 * @return 链表的头指针 */ public Node createListR(int length) { Node head,rear,s; head = new Node(); rear = head; for (int i=1; i<=length; i++) { s = new Node(i); rear.next = s; rear = s; } rear.next = null; return head; } public void traverseList(Node head) { Node p = head.next; while(p != null) { System.out.print(p.data + " "); p = p.next; } System.out.println(); } /** * 链表反转 * @param head 反转前链表的头指针 * @return head 反转后链表的头指针 */ public Node reverseList(Node head) { Node p,q,temp; p = head.next; q = p.next; while (q != null) { temp = q.next; q.next = p; p = q; q = temp; } head.next.next = null; head.next = p; return head; } /** * 在有序的链表中插入一个数还是有序 * @param head 插入前链表的头指针 * @param x 要插入的值 * @param asc 初始链表是否升序 * @return head 插入后链表的头指针 */ public Node insertDataInOrderedList(Node head,int x,boolean asc) { Node p,s,q; q = head; p = q.next; if (asc) { //升序 while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) <= x) { q = p; p = p.next; } s = new Node(x); q.next = s; s.next = p; p = null; q = null; } else { while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) >= x) { p = p.next; q = q.next; } s = new Node(x); q.next = s; s.next = p; p = null; q = null; } return head; } /** * 在有序的链表中删除一个数还是有序 * @param head * @param x * @param asc * @return */ public boolean deleteDataInOrderedList(Node head, int x,boolean asc) { Node p,q; q = head; p = q.next; while ((p != null) && (Integer.parseInt(p.data == null?"":p.data.toString())) != x) { q = p; p = p.next; } if(p == null) { return false; } q.next = p.next; p = null; q = null; return true; } /** * 合并两个有序列表 * @param head1 * @param head2 * @return */ public Node mergeTwoOrderedList(Node head1,Node head2) { Node head,p1 = head1.next,p2 = head2.next; //p1,p2分别为head1,head2的游标 head = new Node(); //生成头结点 head.next = null; while (p1 != null && p2 != null) { if (objToInt(p1.data) <= objToInt(p2.data)) { head.addNodeAtTheEnd(head, objToInt(p1.data)); p1 = p1.next; } else { head.addNodeAtTheEnd(head, objToInt(p2.data)); p2 = p2.next; } } while(p1 != null) { head.addNodeAtTheEnd(head, objToInt(p1.data)); p1 = p1.next; } while(p2 != null) { head.addNodeAtTheEnd(head, objToInt(p2.data)); p2 = p2.next; } return head; } /** * 在链表的末端追加元素 * @param head 原来链表的头指针 * @param x 所追加元素的值 * @return head 追加元素之后的链表的头指针 */ public Node addNodeAtTheEnd(Node head,int x) { Node q = head,p = q.next; while (p != null) { q = p; p = p.next; } Node newNode = new Node(x); q.next = newNode; newNode.next = null; return head; } /** * Object转化为int * @param obj * @return */ public int objToInt(Object obj) { return Integer.parseInt(obj == null ? "" : obj.toString()); }}
Test文件代码如下:
public class Test { public static void main(String[] args) { Node node = new Node(); Node head = node.createListF(6); System.out.print("头插法建立的链表:"); node.traverseList(head); System.out.print("反转后的链表:"); head = node.reverseList(head); node.traverseList(head); System.out.print("插入值为4的数之后的链表:"); head = node.insertDataInOrderedList(head, 4, true); node.traverseList(head); System.out.print("删除链表中第一个值为5的数,是否成功?"); boolean isDeleted = node.deleteDataInOrderedList(head, 5, true); if (isDeleted) { System.out.print("已被删除!"); System.out.println(); } System.out.print("删除链表中第一个值为5的数之后的链表:"); node.traverseList(head); System.out.print("新增值为10的结点:"); node.addNodeAtTheEnd(head, 10); node.traverseList(head); Node newHead = node.createListR(10); System.out.print("原来的head链表:"); node.traverseList(head); System.out.print("原来的newHead链表:"); node.traverseList(newHead); Node mergeNode = node.mergeTwoOrderedList(head, newHead); System.out.println("Merge two linklist:"); node.traverseList(mergeNode); }}
小白所写,有错误请指出。
0 0
- java实现链表及其相关操作
- 邻接链表与图及其相关操作--Java
- java实现链表以及相关操作
- 链表及其基本操作的JAVA实现。
- Java 相关计数问题及其实现
- 块状链表基本操作及其相关例题
- java 链表相关操作
- hbase开发,hbase表操作及其java api实现
- hbase开发,hbase表操作及其java api实现
- 用Java实现顺序表及其基本操作
- 单链表及其相关操作
- 链表相关操作代码实现
- 自实现链表的相关操作
- bitmap思想及其在java中的相关实现
- bitmap思想及其在java中的相关实现
- 二分查找及其相关算法的java实现
- 类Rectangle及其相关操作
- 堆排序及其相关操作
- 学习JavaScript闭包
- 20.Spark上下文构建以及模拟数据生成
- Spring面试,IoC和AOP的理解
- linux学习笔记(六)
- 对电子游戏的平衡性和可玩性的直观感受和对游戏生涯的憧憬
- java实现链表及其相关操作
- 51Nod-1557-两个集合
- 基本的HTTP流程有哪些
- 最高效的oracle分页语句,你会了吗?
- Android优化 —— 布局
- MOOC 简单的整数划分问题
- 大二下,新的开始
- test
- 设计模式——工厂模式