Java设计链表(不带头结点的单链表)
設(shè)計(jì)鏈表的實(shí)現(xiàn)。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val 和 next。val 是當(dāng)前節(jié)點(diǎn)的值,next 是指向下一個(gè)節(jié)點(diǎn)的指針/引用。如果要使用雙向鏈表,則還需要一個(gè)屬性 prev 以指示鏈表中的上一個(gè)節(jié)點(diǎn)。假設(shè)鏈表中的所有節(jié)點(diǎn)都是 0-index 的。
在鏈表類中實(shí)現(xiàn)這些功能:
-
get(index):獲取鏈表中第 index 個(gè)節(jié)點(diǎn)的值。如果索引無(wú)效,則返回-1。
-
addAtHead(val):在鏈表的第一個(gè)元素之前添加一個(gè)值為 val 的節(jié)點(diǎn)。插入后,新節(jié)點(diǎn)將成為鏈表的第一個(gè)節(jié)點(diǎn)。
-
addAtTail(val):將值為 val 的節(jié)點(diǎn)追加到鏈表的最后一個(gè)元素。
-
addAtIndex(index,val):在鏈表中的第 index 個(gè)節(jié)點(diǎn)之前添加值為 val 的節(jié)點(diǎn)。如果 index 等于鏈表的長(zhǎng)度,則該節(jié)點(diǎn)將附加到鏈表的末尾。如果 index 大于鏈表長(zhǎng)度,則不會(huì)插入節(jié)點(diǎn)。如果index小于0,則在頭部插入節(jié)點(diǎn)。
-
deleteAtIndex(index):如果索引 index 有效,則刪除鏈表中的第 index 個(gè)節(jié)點(diǎn)。
-
printList():遍歷鏈表
-
isEmpty():判斷鏈表是否為空
示例:
MyLinkedList linkedList = new MyLinkedList(); linkedList.addAtHead(1); linkedList.addAtTail(3); linkedList.addAtIndex(1,2); //鏈表變?yōu)?-> 2-> 3 linkedList.get(1); //返回2 linkedList.deleteAtIndex(1); //現(xiàn)在鏈表是1-> 3 linkedList.get(1); //返回3 public class MyLinkedList {private int size = 0;//鏈表長(zhǎng)度class Node{private int val;private Node next;public Node(){val = 0;next = null;}public Node (int val){this.val = val;next = null;}}private Node head = null;public MyLinkedList() {//初始化鏈表什么結(jié)點(diǎn)都沒(méi)有}public int get(int index) {if (index<0 || index >= size) return -1;int j = 0;Node p =head;while(p!=null){if (j==index){return p.val;}j++;p = p.next;}return -1;}public void addAtHead(int val) {//鏈表什么結(jié)點(diǎn)都沒(méi)的情況if (head==null){head = new Node(val);}else{Node s = new Node(val);s.next = head;head = s;}size++;}public void addAtTail(int val) {Node s = new Node(val);int j = 0;Node p = head;while(p!=null){if (j==size-1){p.next = s;break;}j++;p = p.next;}//鏈表什么結(jié)點(diǎn)都沒(méi)的情況if (p==null){head = new Node(val);}size++;}public boolean isEmpty(){if (size==0) return true;return false;}public void printList(){Node p = head;while(p!=null){System.out.print(p.val+" ");p = p.next;}}/*addAtIndex(index,val):在鏈表中的第 index 個(gè)節(jié)點(diǎn)之前添加值為 val 的節(jié)點(diǎn)。如果 index 等于鏈表的長(zhǎng)度,則該節(jié)點(diǎn)將附加到鏈表的末尾。如果 index 大于鏈表長(zhǎng)度,則不會(huì)插入節(jié)點(diǎn)。如果index小于0,則在頭部插入節(jié)點(diǎn)。*/public void addAtIndex(int index, int val) {if (index==size){addAtTail(val);//addAtTail()里面已經(jīng)size++,所以外面不用size++}else if (index > size) return ;else if (index <= 0)//記得加等于號(hào),不要寫成(index < 0){addAtHead(val);//addAtHead()里面已經(jīng)size++,所以外面不用size++}else{int j = 0;Node p = head;while(j < index-1){j++;p = p.next;}Node s = new Node(val);s.next = p.next;p.next = s;size++;}}public void deleteAtIndex(int index) {if (index < 0 || index >= size ) return;Node p = head;int j = 0;while(j < index-1){j++;p = p.next;}//如果刪除的是第一個(gè)結(jié)點(diǎn)if (index==0){if (head.next!=null){//鏈表有兩個(gè)以上的結(jié)點(diǎn),所以刪除第一個(gè)結(jié)點(diǎn)時(shí),//可以讓第一個(gè)結(jié)點(diǎn)的值等于下一個(gè)結(jié)點(diǎn),然后就是很簡(jiǎn)單的轉(zhuǎn)換成刪除第二個(gè)結(jié)點(diǎn)了,//將特殊情況變普通head.val = head.next.val;head.next = head.next.next;}else{//鏈表就只有一個(gè)結(jié)點(diǎn)head=null;}}else{p.next = p.next.next;}size--;} }/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/總結(jié)
以上是生活随笔為你收集整理的Java设计链表(不带头结点的单链表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java substring() 方法
- 下一篇: 怕热,出汗多,黑眼圈,浑身无力