你可以選擇使用單鏈表或者雙鏈表,設計并實現自己的鏈表。
單鏈表中的節點應該具備兩個屬性:val
?和?next
?。val
?是當前節點的值,next
?是指向下一個節點的指針/引用。
如果是雙向鏈表,則還需要屬性?prev
?以指示鏈表中的上一個節點。假設鏈表中的所有節點下標從?0?開始。
實現?MyLinkedList
?類:
MyLinkedList()
?初始化?MyLinkedList
?對象。int get(int index)
?獲取鏈表中下標為?index
?的節點的值。如果下標無效,則返回?-1
?。void addAtHead(int val)
?將一個值為?val
?的節點插入到鏈表中第一個元素之前。在插入完成后,新節點會成為鏈表的第一個節點。void addAtTail(int val)
?將一個值為?val
?的節點追加到鏈表中作為鏈表的最后一個元素。void addAtIndex(int index, int val)
?將一個值為?val
?的節點插入到鏈表中下標為?index
?的節點之前。如果?index
?等于鏈表的長度,那么該節點會被追加到鏈表的末尾。如果?index
?比長度更大,該節點將?不會插入?到鏈表中。void deleteAtIndex(int index)
?如果下標有效,則刪除鏈表中下標為?index
?的節點。
提交到力扣的代碼如下:
class ListNode {private Integer val;private ListNode next;public void setVal(Integer val) {this.val = val;}public void setNext(ListNode next) {this.next = next;}public Integer getVal() {return val;}public ListNode getNext() {return next;}
}class MyLinkedList {private ListNode listNode;public void setListNode(ListNode listNode) {this.listNode = listNode;}public ListNode getListNode() {return listNode;}public MyLinkedList(ListNode head) {listNode = head;}public MyLinkedList() {}public int get(int index) {int size = size();if (index < 0 || index > size - 1) {return -1;}ListNode imghead = new ListNode();imghead.setNext(listNode);ListNode cur = imghead.getNext();while (index > 0) {cur = cur.getNext();index = index - 1;}return cur.getVal(); //index=0也是返回cur本身,也就是第一個節點。 index不為0,最終的cur的值就是第index節點的值。}public int size() {//獲取長度ListNode cur = listNode;int size = 0;while (cur != null) {size = size + 1;cur = cur.getNext();}return size;}public void addAtHead(int val) {ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead.getNext();//當前節點移動到虛擬頭節點的下一個節點imghead.setNext(null);//斷開虛擬頭節點與下一個節點連接imghead.setNext(newNode);//重新改變指向newNode.setNext(cur);//重新改變指向listNode = newNode;//最終符合題目要求的節點是newNode ,把newNode給listNode}//尾部插入節點public void addAtTail(int val) {ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead;//while (cur.getNext() != null) {cur = cur.getNext();}cur.setNext(newNode);listNode = imghead.getNext();}//在第index前節點插入一個節點public void addAtIndex(int index, int val) {int size = size();if (index < 0 || index > size) {System.out.println("傳入的節點index小于0或index超過節點索引,無法插入數據");} else if(index==size){addAtTail(val);}else if (index == 0) {//在頭節點前插入addAtHead(val);} else {//index從1到size-1之間ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead.getNext();while (index > 1) {//尋找要插入節點的前一個節點,因為要找的是前一個節點,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext();//先存下下一個節點cur.setNext(newNode);newNode.setNext(tmp);}}//刪除第index的節點public void deleteAtIndex(int index) {int size = size();if (index < 0 || index > size - 1) {System.out.println("傳入的節點index小于0或index超過節點索引,無法刪除數據");} else {ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點if (index == 0) {//刪除第一個節點ListNode tmp = imghead.getNext().getNext();imghead.setNext(null);imghead.setNext(tmp);listNode = imghead.getNext();} else {//index從1到size-1之間ListNode cur = imghead.getNext();while (index > 1) {//尋找要刪除節點的前一個節點,因為要找的是前一個節點,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext().getNext();//先存下下一個節點cur.setNext(tmp);listNode = imghead.getNext();}}}
}/*** 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);*/
本地測試代碼:
package com.company;public class MyLinkedList {private ListNode listNode;public void setListNode(ListNode listNode) {this.listNode = listNode;}public ListNode getListNode() {return listNode;}public MyLinkedList(ListNode head) {listNode = head;}public MyLinkedList() {}public int get(int index) {int size = size();if (index < 0 || index > size - 1) {return -1;}ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);ListNode cur = imghead.getNext();while (index > 0) {cur = cur.getNext();index = index - 1;}return cur.getVal(); //index=0也是返回cur本身,也就是第一個節點。 index不為0,最終的cur的值就是第index節點的值。}public int size() {//獲取長度ListNode cur = listNode;int size = 0;while (cur != null) {size = size + 1;cur = cur.getNext();}return size;}public void addAtHead(int val) {ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead.getNext();//當前節點移動到虛擬頭節點的下一個節點imghead.setNext(null);//斷開虛擬頭節點與下一個節點連接imghead.setNext(newNode);//重新改變指向newNode.setNext(cur);//重新改變指向listNode = newNode;//最終符合題目要求的節點是newNode ,把newNode給listNode}//尾部插入節點public void addAtTail(int val) {ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead;//while (cur.getNext() != null) {cur = cur.getNext();}cur.setNext(newNode);listNode = imghead.getNext();}//在第index前節點插入一個節點public void addAtIndex(int index, int val) {int size = size();if (index < 0 || index > size) {System.out.println("傳入的節點index小于0或index超過節點索引,無法插入數據");} else if(index==size){addAtTail(val);}else if (index == 0) {//在頭節點前插入addAtHead(val);} else {//index從1到size-1之間ListNode newNode = new ListNode();//定義要插入的節點newNode.setVal(val);//給要插入的節點賦值ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點ListNode cur = imghead.getNext();while (index > 1) {//尋找要插入節點的前一個節點,因為要找的是前一個節點,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext();//先存下下一個節點cur.setNext(newNode);newNode.setNext(tmp);}}//刪除第index的節點public void deleteAtIndex(int index) {int size = size();if (index < 0 || index > size - 1) {System.out.println("傳入的節點index小于0或index超過節點索引,無法刪除數據");} else {ListNode imghead = new ListNode();imghead.setVal(-1);imghead.setNext(listNode);//定義虛擬頭節點if (index == 0) {//刪除第一個節點ListNode tmp = imghead.getNext().getNext();imghead.setNext(null);imghead.setNext(tmp);listNode = imghead.getNext();} else {//index從1到size-1之間ListNode cur = imghead.getNext();while (index > 1) {//尋找要刪除節點的前一個節點,因為要找的是前一個節點,所以要大于1cur = cur.getNext();index = index - 1;}ListNode tmp = cur.getNext().getNext();//先存下下一個節點cur.setNext(tmp);listNode = imghead.getNext();}}}
}
package com.company;public class ListNode {private Integer val;private ListNode next;public void setVal(Integer val) {this.val = val;}public void setNext(ListNode next) {this.next = next;}public Integer getVal() {return val;}public ListNode getNext() {return next;}
}
package com.company;import javax.swing.tree.TreeNode;
import java.lang.reflect.Array;
import java.util.*;public class Main {public static void main(String[] args) {ListNode head = new ListNode();head.setVal(2);ListNode second = new ListNode();second.setVal(3);head.setNext(second);ListNode third = new ListNode();third.setVal(4);second.setNext(third);ListNode four = new ListNode();four.setVal(5);third.setNext(four);ListNode five = new ListNode();five.setVal(6);four.setNext(five);ListNode six = new ListNode();six.setVal(7);five.setNext(six);MyLinkedList mylist = new MyLinkedList(head);// int value= mylist.get(5);// mylist.addAtHead(33);// mylist.deleteAtIndex(6);// mylist.addAtIndex(6,44);// int value2= mylist.get(0);}}