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