Java设计链表(不带头结点的单链表)
生活随笔
收集整理的這篇文章主要介紹了
Java设计链表(不带头结点的单链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
設計鏈表的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val 和 next。val 是當前節點的值,next 是指向下一個節點的指針/引用。如果要使用雙向鏈表,則還需要一個屬性 prev 以指示鏈表中的上一個節點。假設鏈表中的所有節點都是 0-index 的。
在鏈表類中實現這些功能:
-
get(index):獲取鏈表中第 index 個節點的值。如果索引無效,則返回-1。
-
addAtHead(val):在鏈表的第一個元素之前添加一個值為 val 的節點。插入后,新節點將成為鏈表的第一個節點。
-
addAtTail(val):將值為 val 的節點追加到鏈表的最后一個元素。
-
addAtIndex(index,val):在鏈表中的第 index 個節點之前添加值為 val 的節點。如果 index 等于鏈表的長度,則該節點將附加到鏈表的末尾。如果 index 大于鏈表長度,則不會插入節點。如果index小于0,則在頭部插入節點。
-
deleteAtIndex(index):如果索引 index 有效,則刪除鏈表中的第 index 個節點。
-
printList():遍歷鏈表
-
isEmpty():判斷鏈表是否為空
示例:
MyLinkedList linkedList = new MyLinkedList(); linkedList.addAtHead(1); linkedList.addAtTail(3); linkedList.addAtIndex(1,2); //鏈表變為1-> 2-> 3 linkedList.get(1); //返回2 linkedList.deleteAtIndex(1); //現在鏈表是1-> 3 linkedList.get(1); //返回3 public class MyLinkedList {private int size = 0;//鏈表長度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() {//初始化鏈表什么結點都沒有}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) {//鏈表什么結點都沒的情況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;}//鏈表什么結點都沒的情況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 個節點之前添加值為 val 的節點。如果 index 等于鏈表的長度,則該節點將附加到鏈表的末尾。如果 index 大于鏈表長度,則不會插入節點。如果index小于0,則在頭部插入節點。*/public void addAtIndex(int index, int val) {if (index==size){addAtTail(val);//addAtTail()里面已經size++,所以外面不用size++}else if (index > size) return ;else if (index <= 0)//記得加等于號,不要寫成(index < 0){addAtHead(val);//addAtHead()里面已經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;}//如果刪除的是第一個結點if (index==0){if (head.next!=null){//鏈表有兩個以上的結點,所以刪除第一個結點時,//可以讓第一個結點的值等于下一個結點,然后就是很簡單的轉換成刪除第二個結點了,//將特殊情況變普通head.val = head.next.val;head.next = head.next.next;}else{//鏈表就只有一個結點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);*/總結
以上是生活随笔為你收集整理的Java设计链表(不带头结点的单链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java substring() 方法
- 下一篇: Java面向对象编程(基础部分)