203.移除链表元素
Leetcode链接: link
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyhead = new ListNode(0,head);
ListNode previous = dummyhead;
ListNode temp = dummyhead.next;
while(temp != null){
if(temp.val == val){
temp = temp.next;
previous.next = temp;
}else{
previous = temp;
temp = temp.next;
}
}
return dummyhead.next;
}
}
Linked List作为我学的第一个数据结构,我对此还是了解的比较深刻。这一题是十分基础的一个题目,只花费10分钟就完成了。
我先是在head前面加了个假的head。这样就可以使用两个指针一个是previous,一个temp。previous在前,temp在后,previous主要是用来连接下一个node的,temp则是用来检测temp.val是不是需要删除。最后返回dummyhead.next。以为我们dummyhead是个假的head。dummyhead连接的才是真的head。
707.设计链表
// class ListNode {
// int val;
// ListNode next;
// ListNode(){}
// ListNode(int val) {
// this.val=val;
// }
// }
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
size = 0;
head = null;
}
public int get(int index) {
if(index >= size){
return -1;
}else{
ListNode temp = head;
for(int i = 0; i < index; i ++){
temp = temp.next;
}
return temp.val;
}
}
public void addAtHead(int val) {
ListNode temp = new ListNode(val);
temp.next = this.head;
this.head = temp;
size++;
}
public void addAtTail(int val) {
if(size == 0){
head = new ListNode(val);
}
ListNode temp = head;
for(int i = 0; i < size-1; i ++){
temp = temp.next;
}
temp.next = new ListNode(val);
size++;
}
public void addAtIndex(int index, int val) {
if(index > size || index < 0){
return;
}else if(index == 0){
addAtHead(val);
}else if(index == size){
addAtTail(val);
}else{
ListNode temp = head;
for(int i = 0; i < index-1; i ++){
temp = temp.next;
}
ListNode tempNext = temp.next;
temp.next = new ListNode(val);
temp.next.next = tempNext;
size++;
}
}
public void deleteAtIndex(int index) {
if(index >= size || index < 0){
return;
}else {
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode temp = dummyhead;
for(int i = 0; i < index; i ++){
temp = temp.next;
}
temp.next = temp.next.next;
head = dummyhead.next;
size--;
}
}
}
这一题也是很基础的一题,只要对linklist足够了解就知道该知道怎么做这题,唯一遇到比较麻烦的地方是如果准备判断指针在for循环中是否落在了自己想要的位置。
206.反转链表
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode node1 = null;
ListNode node2 = head;
ListNode temp = node2.next;
while(node2 != null){
node2.next = node1;
node1 = node2;
node2 = temp;
if(node2 != null){
temp = node2.next;
}
}
return node1;
}
}
这题去年做过,今年再做也没花费多久的时间。主要是需要使用三个LinkList的指针, 如同下面这个linkedlist
node1 -> node2 -> temp -> null
在每个loop中我们需要把node1和node2的指针调转即可,这里说一下为什么需要temp,这是我们旋转之后的样子。
node1 <- node2 -- temp -> null
由于node2.next指向了node1,使得原本指向temp位置的没了。那我们就无法找到temp。所以需要一个temp来先保存一下。
总结
LinkedList是我最熟悉的一部分。对我来说属于是熟悉代码纯复习。前前后后还是花费了一小时才写出来,debug还是花费了大量的时间。
记录一下自己的学习时长:
leetcode+博客:1h