代码随想录算法训练营第三天| 203. 移除链表元素 707.设计链表 206.反转链表
203. 移除链表元素
https://leetcode.cn/problems/remove-linked-list-elements/description/

public ListNode removeElements(ListNode head, int val) {
if (head == null) return head;
ListNode wHead = new ListNode(Integer.MAX_VALUE,head);
ListNode p = head;
ListNode pre = wHead;
while (p != null){
if (p.val == val){
pre.next = p.next;
p = pre.next;
}else {
pre = pre.next;
p = p.next;
}
}
return wHead.next;
}
总结:这破题,出的就有问题,这就是不带头结点的链表,非得说是带头节点的,哪有带头节点的链表头结点还有值的啊,破题浪费我半个多小时
707.设计链表
https://leetcode.cn/problems/design-linked-list/description/


class MyLinkedList {
int size;
ListNode head;
public MyLinkedList(){
size = 0;
head = new ListNode(Integer.MAX_VALUE);
}
public int get(int index){
if (index < 0 || index >= size){
return -1;
}
ListNode p = head;
for (int i = 0; i <= index; i++) {
p = p.next;
}
return p.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 || index < 0) return;
ListNode p = head;
for (int i = 0; i < index; i++) {
p = p.next;
}
if (index == size){
ListNode newNode = new ListNode(val);
p.next = newNode;
size++;
}else {
ListNode newNode = new ListNode(val,p.next);
p.next = newNode;
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;
}
p.next = p.next.next;
size--;
}
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
}
总结:细致一点就好了,不要急
206.反转链表
https://leetcode.cn/problems/reverse-linked-list/description/

//头插法
public static ListNode reverseList(ListNode head) {
ListNode newHead = new ListNode();
while (head != null){
ListNode l = head.next;
head.next = newHead.next;
newHead.next = head;
head = l;
}
return newHead.next;
}
//三指针法
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode p = head;
ListNode temp = null;
while (p != null){
temp = p.next;
p.next = pre;
pre = p;
p = temp;
}
return pre;
}
总结:注意辨析题目到底是不是个有头结点的链表,很烦,两种方法,头插法,三指针(逻辑上通过改变指针走向去实现翻转)
浙公网安备 33010602011771号