定义链表
public class ListNode {int val; //节点的值ListNode next; //下一个节点public ListNode() {}public ListNode(int val) {this.val = val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == 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 输出:[]
class Solution {public ListNode removeElements(ListNode head, int val) {while(head != null && head.val == val){head = head.next;}ListNode curr = head;while(curr != null){while(curr.next != null && curr.next.val == val){curr.next = curr.next.next;}curr = curr.next;}return head;}
}
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
在链表类中实现这些功能:
index 个节点的值。如果索引无效,则返回-1。val 的节点。插入后,新节点将成为链表的第一个节点。val 的节点追加到链表的最后一个元素。index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。index 有效,则删除链表中的第 index 个节点。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 currentNode = head;for(int i = 0; i <= index; i++){currentNode = currentNode.next;}return currentNode.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 addNode = new ListNode(val);addNode.next = pred.next;pred.next = addNode;}public void deleteAtIndex(int index) {if(index < 0 || index >= size){return;}size--;ListNode pred = head;for(int i = 0; i < index; i++){pred = pred.next;}pred.next = pred.next.next;}
}
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例2:输入:head = [] 输出:[]
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;ListNode temp = null;while(cur != null){temp = cur.next;cur.next = pre;pre = cur;cur = temp;}return pre;}
}
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1:输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例2:输入:head = [] 输出:[]
class Solution {public ListNode swapPairs(ListNode head) {ListNode virtualNode = new ListNode();virtualNode.next = head;ListNode pre = virtualNode;while (pre.next != null && pre.next.next != null) {ListNode temp = head.next.next; // 缓存//交换pre.next = head.next;head.next.next = head;//交换完连接上剩余的节点head.next = temp;//继续下一次循环pre = head;head = temp;}return virtualNode.next;}
}
上一篇:2022美亚个人赛复盘
下一篇:因子模型:协方差矩阵