1、单链表代码实现
/** * 文件描述:手写单链表以及单链表的翻转(不考虑代码优化的情况) * 作者:chenjingkun708 * 创建时间:2020/3/20 * 更改时间:2020/3/20 */ public class MyLinkedList<V>{ Node<V> head; int size; public MyLinkedList(){ } /* * 添加 */ public V add(V value){ if (value==null){ return null; } Node<V> newNode = new Node<>(value,null); if (head==null){ head = newNode; }else { Node first = head; while (first.next!=null){ first = first.next; } first.next = newNode; } size++; return value; } /* 获取某个位置的值 */ public V get(int index){ if (index< 0 && index>=size){ return null; } int num = 0; Node<V> node = head; while (node!=null&&num++!=index){ node = node.next; } if (node!=null){ return node.value; } return null; } /* 移除 */ public boolean remove(int index){ int num = 0; Node<V> node = head; Node<V> pre = null; while (node!=null&&num++!=index){ pre = node; node = node.next; } if (node!=null){ Node next = node.next; pre.next = next; return true; } return false; } //打印列表 public void printAll(){ Node first = head; while (first!=null){ Log.i("android_test",""+first.value); first = first.next; } } static class Node<V>{ V value; Node<V> next; public Node(V value, Node<V> next) { this.value = value; this.next = next; } } }
二、单链表的翻转
方式1、就地反转(需保留上一个节点)
代码实现
/* 翻转列表(采用的是就地翻转的方法,从头部开始反转) */ public void reserve(){ Node<V> node = head,preNode = null,nextNode= null; while (node!=null){ nextNode = node.next; node.next = preNode; preNode = node; node = nextNode; } head = preNode; }
方式2、递归方式(从尾巴开始反转)
详细看文章https://www.jianshu.com/p/36ed87e1937a解释与实现
二、代码测试
MyLinkedList myLinkedList = new MyLinkedList(); myLinkedList.add(1); myLinkedList.add(2); myLinkedList.add(3); myLinkedList.add("chenjk"); myLinkedList.add(5); myLinkedList.printAll(); Log.i("android_test","获取第三个位置的值="+myLinkedList.get(3)); myLinkedList.remove(3); myLinkedList.printAll(); myLinkedList.reserve(); Log.i("android_test","翻转打印"); myLinkedList.printAll();
打印结果:
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: chenjk
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 获取第三个位置的值=chenjk
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 翻转打印
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 5
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 3
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 2
2020-03-24 16:41:00.874 32688-32688/example.ndk.cjk.datastructdemo I/android_test: 1