代码随想录Day3
链表
移除链表元素
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
注意: 这个题目虽然简单,但是提醒了我们,在对数组完成操作时,很多时候是需要加一个新的虚拟头结点来指向head ;目的是为了便于操作。使用了fakeHead节点之后,就不用额外考虑head之类的特殊情况。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//创建一个假头结点,放在题目中head之前
ListNode fakeHead=new ListNode();
fakeHead.next=head;
//创建一个节点pre指向当年要测试节点的前一个节点
ListNode pre=fakeHead;
//创建一个节点cur 代表当前在测试的节点
ListNode cur=pre.next;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
cur=cur.next;
}
else{
pre=pre.next;
cur=cur.next;
}
}
return fakeHead.next;
}
}
反转链表
“给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。”
上一个题目移除链表元素考察的是对于链表的删除操作。这道题更加综合,考察的是“删除”以及“插入”(这里使用的是头插法)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//仍然是创建一个虚伪头结点
ListNode fakeHead=new ListNode();
ListNode cur=head;
while(cur!=null){
ListNode temp=cur.next;
cur.next=fakeHead.next;
fakeHead.next=cur;
cur=temp;
}
return fakeHead.next;
}
}
设计链表
class Node{
int val;
Node next;
public Node(){
}
public Node(int val){
this.val=val;
}
}
class MyLinkedList {
Node head; //记录头结点
int size;//记录整个链表的大小
public MyLinkedList() {
head=new Node();
size=0;
}
public int get(int index) {
if(index<0 || index>=size)
return -1;
Node node=head;
for(int i=0;i<=index;i++){
node=node.next;
}
return node.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<0 || index>size)
return;
Node node=new Node(val);
Node pre=head;
for(int i=0;i<index;i++){ //找到要插入位置的前置节点
pre=pre.next;
}
node.next=pre.next;
pre.next=node;
size++;
return;
}
public void deleteAtIndex(int index) {
if(index<0 || index>=size)
return;
size--;
if(index==0){
head=head.next;
return;
}
Node pre=head;
Node cur=pre.next;
for(int i=0;i<index;i++){ //找到要插入位置的前置节点
pre=pre.next;
cur=cur.next;
}
pre.next=cur.next;
return;
}
}
/**
* 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);
*/