问题:
在尾插法创建链表时,找到最后一个结点,我感觉找到的是最后一个结点,但是提示空指针异常
题目链接:
LeetCode 707: 设计链表
我写的代码:
//单独设计一个头结点
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
//定义链表的头结点和保存链表长度的整型变量
int size;
ListNode head;
public MyLinkedList() {
//完成链表初始化
size = 0;
head = new ListNode(0);
}
public int get(int index) {
/* 判断索引是否有效
“假设链表中的所有节点都是 0-index 的”说明:链表中第一个结点对应的索引为零*/
if(index < 0 || index >= size){
return -1;
}
//遍历链表,找到索引index处链表的指针
ListNode current = head;
for(int i = 0; i <= index; i++){
current = current.next;
}
return current.val;
}
/*
对于头插法创建链表和尾插法创建链表可以看成是对addAtIndex(index, val)
的特殊应用,所以设计好通用创建链表的方法直接调用即可,可以分别设计头插
法和尾插法,在addAtIndex方法中调用这两个方法也可以
*/
public void addAtHead(int val) {
//创建待插入的结点
ListNode node = new ListNode(val);
//对于插入的结点要放在头结点与原有链表的中间
node.next = head.next;
head.next = node;
size++;
}
public void addAtTail(int val) {
//创建待插入的结点
ListNode node = new ListNode(val);
ListNode q = head;
for(int i = 0; i < size; i++){
q = q.next;
}
node.next = q.next; //此处出现了空指针异常
q.next = node;
size++;
}
public void addAtIndex(int index, int val) {
if(index > size){
return;
}
if(index < 0){
addAtHead(val);
}else if(index == size){
addAtTail(val);
}else{
//插入到链表中的指定位置
ListNode node = new ListNode(val);
ListNode p = head;
for(int i = 0; i < index; i++){
p = p.next;
}
//当前p指向待插入位置的前一个结点
node.next = p.next;
p.next = node;
size++;
}
}
public void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return;
}
ListNode p = head;
for(int i = 0; i < index; i++){
p = p.next;
}
if(p.next != null){
p.next = p.next.next;
}
}
}
/**
* 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);
*/