java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
2016-04-29 09:45
501 查看
最近面试被问到链表的问题很多,让自己写一个链表,并实现链表逆序,自己突然发现,用java实现链表还真是一件费时的事情,更何况笔试那点时间。现在做一下记录,如果有错误,希望看见的人能指出,谢谢。
定义一个Node节点:
自定义单链表,并实现一些功能:
public class LinkedList {
Node head = null;// 创建一个空链表
Node last = head;// 尾节点,并记录当前节点的位置
int modCount = 0; // 统计节点个数
// 添加一个元素
public void add(Object obj) {
Node node = new Node(obj);
modCount++;
if (head == null) {
head = node; // 如果链表为空,定义头节点
} else {
last.next = node; // 当前节点的下一个节点
}
last = node; // 最后的节点为当前节点
}
定义一个Node节点:
public class Node { Node next; //下一个节点的引用 Object obj; //节点元素 public Node(Object obj) { this.obj = obj; } }
自定义单链表,并实现一些功能:
public class LinkedList {
Node head = null;// 创建一个空链表
Node last = head;// 尾节点,并记录当前节点的位置
int modCount = 0; // 统计节点个数
// 添加一个元素
public void add(Object obj) {
Node node = new Node(obj);
modCount++;
if (head == null) {
head = node; // 如果链表为空,定义头节点
} else {
last.next = node; // 当前节点的下一个节点
}
last = node; // 最后的节点为当前节点
}
// 删除下标为index的节点 public void remove(int index) { if (index >= modCount) { // 抛异常 System.out.println("indexOutOfBoundsException!");// 最好自定义异常抛出,这里演示 return; } Node node = head; // 如果节点为第一个节点 if (index == 0) { head = head.next; // 将头节点指向第二个节点 modCount--; return; } // 如果节点为最后一个节点,找到最后一个节点的前一个节点,不用管 if (index == modCount - 1) { System.out.println("ddd"); // 找到最后一个节点的前一个节点 int j = 0; while (node != null && j < index - 1) { // 最后一个节点的前一个节点 node = node.next; j++; } last = node; // 最后一个节点设置为前一个节点 modCount--; return; } // 如果节点为中间节点 int j = 0; while (node != null && j < index - 1) { // 查找被删除的节点的前一个节点 node = node.next; j++; } node.next = node.next.next; // 被删除节点的下一个节点设置为被删除节点的下下个节点 modCount--; }
public int getSize() { return modCount; } public Object get(int index) { Node node = head; if (index >= modCount) { // 抛异常 System.out.println("indexOutOfBoundsException!"); return -1; } for (int i = 0; i < index; i++) { node = node.next; } return node.obj; } //链表反转 public LinkedList reverseList(LinkedList linkedList) { LinkedList temp = new LinkedList(); for(int i = linkedList.getSize() - 1; i >= 0; i--) { temp.add(linkedList.get(i)); } return temp; }
// 打印链表-node表示从哪个节点开始打印 public void printNode(Node node) { if (node != null) { System.out.println(node.obj); node = node.next; printNode(node);// 递归调用 } } public static void main(String[] args) { LinkedList ls = new LinkedList(); ls.add(1); ls.add(3); ls.add(5); ls.remove(0); // 删除下标为0的节点 ls.add(7); // ls.remove(3); // ls.add(10); // ls.add(10); // ls.add(10); // ls.printNode(ls.head); // System.out.println(ls.getSize()); // // for(int i = 0; i < ls.getSize(); i++) { // ls.get(i); // System.out.println(ls.get(i)); // } //ls = ls.reverseList(ls); //链表逆序 ls.printNode(ls.head); } }
相关文章推荐
- 20145206《Java程序设计》第9周学习总结
- Json在java中的使用
- java排序之快排
- Java URL自定义私有网络协议
- struts2标签库详解
- spring对乱码的处理及其springmvc核心器注册
- 详解备忘录模式及其在Java设计模式编程中的实现
- Dubbo与Zookeeper SpringMVC整合和使用(负载均衡 容错)
- spring 解决多数据源问题,主要的继承类为AbstractRoutingDataSource
- 转:Eclipse常见问题,快捷键收集
- 在Java里处理文件的技巧
- [转]MyEclipse for Spring2014破解
- windows7环境下为eclipse安装CDT插件
- Eclipse安装Freemarker插件
- 升级Struts2版本到2.3.28.1,
- 在Java里处理文件的技巧
- 正则表达式知识详解之替换 (java版示例)
- RPC应用的java实现(转)
- 4.29 java
- Java模糊查询方法详解