题目编号:
203、移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/
707、设计链表 https://leetcode.cn/problems/design-linked-list/
206、反转链表 https://leetcode.cn/problems/reverse-linked-list/
203、移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
看到题目的想法:
1、学习链表的结构
2、学习虚拟头节点的思想(能避免分开讨论)
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy= new ListNode(-1,head);
ListNode pre=dummy;
ListNode cur=head;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
}else{
pre=cur;
}
cur=cur.next;
}
return dummy.next;
}
}
做题目的收获:
在做链表题目的时候,学会使用虚拟头节点去解决问题
707、设计链表
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
看到题目的想法:
题目比较好,覆盖了多个链表的操作,值得学习
class ListNode{
int val;
ListNode next;
ListNode(){}
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) {
if(index<0 || index>=size){
return -1;
}
ListNode cur =head;
for(int i=0;i<=index;i++){
cur=cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
addAtIndex(0,val);
}
public void addAtTail(int val) {
addAtIndex(size,val);
}
public void addAtIndex(int index, int val) {
if(index>size){
return;
}
if(index<0){
index=0;
}
size++;
ListNode pred=head;
for(int i=0;i<index;i++){
pred = pred.next;
}
ListNode toadd = new ListNode(val);
toadd.next=pred.next;
pred.next=toadd;
}
public void deleteAtIndex(int index) {
if(index<=0 ||index>=size){
return;
}
size--;
if(index==0){
head=head.next;
return;
}
ListNode pred=head;
for(int i=0;i<index;i++){
pred=pred.next;
}
pred.next=pred.next.next;
}
}
做题目的收获:
涉及到多个链表的操作,值得学习,学习到了获取对应位置的元素的值,对应的索引位置加入元素,删除第index个索引的元素的值。
206、反转链表
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
看到题目的想法:
采用双指针的方法来解决
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pred=null;
ListNode cur=head;
ListNode temp=null;
while(cur!=null){
temp=cur.next;
cur.next=pred;
pred=cur;
cur=temp;
}
return pred;
}
}
做题目的收获:
又一种双指针的方法来解决问题,注意指针向后移动时候的顺序。