`
xiaobai233
  • 浏览: 59830 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内部类实现链表的增加、删除、插入、倒置

阅读更多
最经复习数据结构,自己实现了个链表倒置。
/*
 * @author Danny Bai e-mail:dannybai7@gmail.com
 * @2009-10-26
 */
package com.bintree;

public class Link {
	/* 内部类开始 */
	class Node {
		private String name;
		private Node next;
		
		public Node(String name) {
			this.name = name;
		}
		public String getName() {
			return this.name;
		}
		//添加节点
		public void addNode(Node newNode) {
			if (this.next == null) {
				this.next = newNode;
			} else {
				this.next.addNode(newNode);
			}
		}
		//输出节点
		public void printNode() {
			System.out.println(this.name);
			if (this.next != null) {
				this.next.printNode();
			}
		}
		//搜索节点
		public boolean serachNode(String name) {
			if (name.equals(this.name)) {
				return true;
			} else {
				if (this.next != null) {
					return this.next.serachNode(name);
				} else {
					return false;
				}
			}
		}
		//删除节点
		public void deleteNode(Node preNode, String name) {
			if (name.equals(this.name)) {
				preNode.next = this.next;
			} else {
				this.next.deleteNode(preNode, name);
			}
		}
		//插入节点
		//在名为position的节点前插入新节点
		public void insertNode(Node preNode, Node newNode, String position) {
			if (name.equals(this.name)) {
				preNode.next = newNode;
				newNode.next = this;
			} else {
				this.next.insertNode(preNode, newNode, name);
			}
		}
		//倒置节点
		public void reverseNode(Node preNode) {
			if (this.next != null) {
				Node tempNode = this.next;//存放下一个节点,用于递归调用
				this.next = preNode;
				tempNode.reverseNode(this);
			} else {//最后一个节点,递归结束
				this.next = preNode;
				head = this;//将倒置后的根节点传给外部类的head变量,用于打印输出
			}
		}
	}
	/* 内部类结束 */
	
	private Node root;
	
	private Node head;//链表倒置时存放倒置后的根节点
	
	public void add(String name) {
		Node newNode = new Node(name);
		if (this.root == null) {
			this.root = newNode;
		} else {
			this.root.addNode(newNode);
		}
	}
	
	public void print() {
		if (this.root != null) {
			this.root.printNode();
		}
	}
	
	public boolean serach(String name) {
		if (this.root != null) {
			return this.root.serachNode(name);
		} else {
			return false;
		}
	}
	
	public void delete(String name) {
		if (this.serach(name)) {
			if (name.equals(this.root.name)) {//删除根节点
				if (this.root.next != null) {
					this.root = this.root.next;
				} else {
					this.root = null;
				}
			} else {
				this.root.next.deleteNode(root, name);
			}
		} else {
			System.out.println("不存在名为 " + name + " 的节点");
		}
	}
	
	public void insert(String position, String name) {
		if (this.serach(position)) {
			Node newNode = new Node(name);
			if (position.equals(this.root.name)) {
				newNode.next = this.root;
				this.root = newNode;
			} else {
				this.root.next.insertNode(root, newNode, position);
			}
		}
	}
	
	public void reverse() {
		if (this.root.next != null) {
			this.root.next.reverseNode(root);
			this.root.next = null;
			this.root = head;
		}
		
	}
}

class Test {
	public static void main(String[] args) {
		Link link = new Link();
		link.add("1");
		link.add("2");
		link.add("3");
		link.add("4");
		
		link.reverse();
		link.print();
		
	}
}

分享到:
评论

相关推荐

    倒置——链表(附源代码)

    这使得链表在处理动态数据或者需要频繁插入和删除操作时表现出色。 在“倒置——链表”这个主题中,我们关注的是如何反转一个链表。这是一个常见的编程问题,有助于锻炼对指针操作的理解和链表结构的掌握。通常,...

    Java集合框架常见面试题夜间阅读版.pdf

    LinkedList内部通过链表实现,适合频繁插入和删除操作,但随机访问性能较低。Vector类似于ArrayList,但是它支持线程同步,因此在多线程环境下可以保证线程安全。 Set接口是一个不允许有重复元素的集合。Set接口的...

    传智播客扫地僧视频讲义源码

    15_复数类_所有函数都写在类的内部 16_复数类_所有函数都写在类的外部_上 17_复数类_所有函数都写在类的外部_下 18_复数类_所有函数都写在类的外部(h和cpp分开) 19_类模板中的static关键字 20_案例_数组模板类_需求...

    java中级面试题(自己汇总)

    但这其实是个伪命题,因为JDK7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置(就是因为头插)所以最后的结果还是打乱了插入的顺序 有序的map * HashMap、HashTable、...

    2、线性结构1

    插入和删除操作可能需要平均移动一半的元素,因此时间复杂度最坏也是线性的(O(n)),但在最好情况下,如果插入或删除的位置在表末尾,则时间复杂度为O(1)。 链式存储的线性表分为单链表、循环单链表和双向链表。在...

    两个实用的C++通讯录源程序

    7. **容器类**:C++标准库中的`std::vector`或`std::list`等容器类可能被用作存储联系人的集合,它们提供了方便的插入、删除和遍历操作。 8. **排序和搜索算法**:为了高效地查找和排序联系人,程序可能使用内置的`...

    java面试题

    - **链表**:掌握单链表、双链表的基本操作,包括插入、删除、查找。 - **栈与队列**:理解栈的后进先出(LIFO)特性,队列的先进先出(FIFO)特性,以及它们的应用场景。 - **树**:掌握二叉树的遍历(前序、...

    [详细完整版]数据结构作业.pdf

    4. **循环链表插入**:在已排序的链表中找到合适位置,插入新节点,并保持顺序。 5. **单链表倒置**:使用三个指针,将当前节点的next指向前一个节点,同时移动指针。 6. **双向链表插入**:在两个特定节点之间插入...

    Android中高级面试必知必会.pdf

    - **LinkedList**:基于链表的数据结构,通过双向链表实现,插入和删除操作效率较高,因为不需要移动大量元素,但随机访问效率较低。 - **HashSet**:基于HashMap实现的Set集合,保证了元素的唯一性。添加、删除和...

    Java笔试面试题解答

    `java.util.List`接口的实现类及其优缺点** - **ArrayList**: 动态数组实现,适用于随机访问,插入或删除元素效率较低。 - **LinkedList**: 双向链表实现,适合频繁插入和删除元素的场景,随机访问效率低。 - **...

    2022面试题6java背诵版本.doc

    - LinkedList:链表结构,插入和删除速度快,但随机访问慢。 - HashSet:无序且不重复的元素集合,基于HashMap实现。 - TreeSet:有序且不重复的元素集合,基于TreeMap实现。 - HashMap:键值对存储,快速查找,...

    2018年最全Java面试通关秘籍第四套.docx

    后者基于链表,适合于频繁插入和删除。 - **HashMap和Hashtable**:HashMap是非同步的,而Hashtable是同步的,不支持null键和值。 - **多线程下的集合问题**:如HashMap在多线程环境下可能导致死循环和Hash DOS...

    java面试笔记整理,包含java,redis,kafka等

    - **String类内部使用final修饰的字符数组存储字符串。** - **不可变性保证了字符串的安全性和效率。** #### 十六、JDK9中String底层实现的变化 - **从JDK9开始,String底层实现从char[]改为byte[]。** - **这样的...

    Java后端技术面试基础汇总

    - `LinkedList`基于双向链表实现,插入和删除效率高。 - **HashMap和Hashtable的区别:** - `HashMap`允许`null`键和`null`值,`Hashtable`不允许。 - `HashMap`非线程安全,`Hashtable`线程安全。 - **HashSet...

    代码重构源码(包含重构前后代码)

    这样做可以提高查找、插入和删除操作的速度。 此外,单元测试在重构过程中扮演了保驾护航的角色。在修改代码之前,我们需要编写单元测试以确保重构不会破坏现有功能。这些测试在重构完成后也能作为保证质量的防线,...

    程序员面试宝典大全,大全

    - **链表**:理解单链表、双链表的结构,以及插入、删除操作。 - **栈与队列**:掌握栈的后进先出(LIFO)和队列的先进先出(FIFO)原理。 - **排序与查找**:熟练运用冒泡、选择、插入、快速排序,以及二分查找...

    Java范例开发大全 (源程序)

     第10章 内部类与接口(教学视频:41分钟) 290  10.1 成员内部类 290  实例175 成员内部类的使用规范 290  实例176 猜谜 292  10.2 方法内部类 294  实例177 局部内部类的使用规范 294  实例178 奖学...

    java范例开发大全(pdf&源码)

    第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 实例175 成员内部类的使用规范 290 实例176 猜谜 292 10.2 方法内部类 294 实例177 局部内部类的使用规范 294 实例178 奖学金的评分标准 295 10.3...

Global site tag (gtag.js) - Google Analytics