Java 单链表的反转 以及 双向链表的实现
来源:互联网 发布:网王之数据下的温柔 编辑:程序博客网 时间:2024/05/17 23:45
看代码吧, 详情都写在注释里了
单链表的反转:
/** * 单链表的反转 1<-2<-3<-4 ==> 1->2->3->4 * * @author he * */class Node<T> {T item;Node next = null;public Node(T item) {this.item = item;}}public class reverseLinkedlist {// 迭代实现链表反转public static Node reverse(Node x) {Node first = x;Node reverse = null;while (first != null) {Node second = first.next;first.next = reverse;reverse = first;first = second;}return reverse;}// 递归实现链表反转public static Node reverseGcd(Node first) {if (first == null) {return null;}if (first.next == null) {return first;}Node second = first.next;second.next = first;first.next = null;Node rest = reverseGcd(second);return rest;}public static void main(String[] args) {Node<Integer> node = new Node<Integer>(1);node.next = new Node<Integer>(2);node.next.next = new Node<Integer>(3);System.out.println(reverse(node).item);// 3System.out.println(reverseGcd(node).item);// 1 ,true 因为链表已经被反转过一次}}
双向链表的实现:
/** * P104 T31 双向链表 相当于简化版的Linkedlist * 主要实现了从表头,表尾插入一个结点,在指定结点之前或之后插入一个结点, * 从表头,表尾删除一个结点,删除指定结点 * 指定索引返回结点 * * * 测试通过; * * @author he * */class DoubleNode<T> {private int N;// 记录元素个数private Node first;// 头结点private Node last;// 尾结点private class Node {T item;Node perv;// 前一个结点Node next;// 后一个结点@Overridepublic String toString() {// TODO Auto-generated method stubreturn item + "";}}// 根据索引获取结点public Node getNode(int index) {if (index < 0 || index >= N) {throw new IndexOutOfBoundsException();}Node node = first;for (int i = 0; i < index; i++) {node = node.next;}return node;}// 判断是否为空public boolean isEmpty() {return N == 0;}// 元素个数public int size() {return N;}// 表头插入结点public void pushFirst(T item) {Node oldfirst = first;first = new Node();first.item = item;if (isEmpty()) {last = first;} else {first.next = oldfirst;oldfirst.perv = first;}N++;}// 在指定结点前添加新结点public void pushBefore(Node newnode, Node node) {newnode.next = node;newnode.perv = node.perv;newnode.next.perv = newnode;// 防止在头结点前面插入新结点if (newnode.perv != null) {newnode.perv.next = newnode;}N++;}// 在指定索引前插入新结点public void pushBeforeOfIndex(T item, int index) {Node node = getNode(index);Node newnode = new Node();newnode.item = item;pushBefore(newnode, node);}// 从表尾插入public void pushLast(T item) {Node oldlast = last;last = new Node();last.item = item;last.next = null;if (isEmpty()) {first = last;} else {oldlast.next = last;last.perv = oldlast;}N++;}// 在指定结点后添加新结点public void pushAfter(Node newnode, Node node) {newnode.perv = node;newnode.next = node.next;newnode.perv.next = newnode;// 防止在尾结点之后插入新结点if (newnode.next != null) {newnode.next.perv = newnode;}N++;}// 在指定索引之后添加结点public void pushAfterOfIndex(T item, int index) {Node newnode = new Node();newnode.item = item;Node node = getNode(index);pushAfter(newnode, node);}// 从表头删除一个结点public void popFirst() {first = first.next;if (first != null) {first.perv = null;}N--;}// 从表为删除一个结点public void popLast() {last.perv.next = null;last.perv = null;N--;}// 删除指定的结点public void pop(Node node) {node.perv.next = node.next;node.next.perv = node.perv;node.perv = null;node.next = null;N--;}// 删除指定索引的结点public void popOfIndex(int index) {if (index == 0) {popFirst();} else if (index == N - 1) {popLast();} else {Node node = getNode(index);pop(node);}}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();Node node = first;for (int i = 0; i < N; i++) {sb.append("[");sb.append(node);sb.append("]");sb.append(",");node = node.next;}return sb.toString();}}public class DoubleLinkedlist {public static void main(String[] args) {DoubleNode<Integer> d = new DoubleNode<Integer>();d.pushFirst(1);d.pushFirst(2);d.pushFirst(3);// d.pushFirst(4);d.pushLast(5);// d.pushLast(6);// System.out.println(d.size());// d.pushBeforeOfIndex(10, 1);// d.pushAfterOfIndex(9, 0);// d.popFirst();// d.popFirst();d.popOfIndex(0);// d.popOfIndex(3);// d.popLast();System.out.println(d.toString());// System.out.println(d.getNode(2));}}
0 0
- Java 单链表的反转 以及 双向链表的实现
- C语言实现双向链表的反转
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- 双向链表的Java实现,以及相关函数的实现
- 反转链表的Java实现
- java实现链表的反转
- java实现链表的反转
- Java:如何实现链表的反转
- 链表的反转(java实现)
- Java双向队列,用双向链表实现的
- 单链表的反转java实现
- java 实现单链表的反转
- java 实现单链表的反转
- 单链表的反转-Java实现
- java实现单链表的反转
- java实现双向链表的操作
- Win10 VS2013 Compile Intro - C2011 Error
- 从Eclipse迁移到Android studio(还有遇到的各种问题)
- ios-基础之【10】-NSTimer
- 删除区间内的元素(线性表)
- sql学习笔记(二)
- Java 单链表的反转 以及 双向链表的实现
- Java中的Socket通信
- javaEE SSH框架 BaseAction的抽取以及其他方面代码优化
- JVM-内存分配与回收策略
- 机器学习:核函数的一个小题目
- NVIDIA Jetson TK1 rosrun rviz segmentation fault的解决方法
- (p241)活动选择
- Android系统服务
- java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter7-33