Java相关-链表-设计链表-力扣707
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性: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);}}