203.移除链表元素
题目链接:力扣题目链接
思路:考虑到删除有两种情况,删除头节点个删除链表中间的节点,所以操作是不一样的。看过题解后,设立一个虚拟链表吧头结点放入到next后,之后返回虚拟链表头节点的next就可以完美避免要删除对象有两种情况,就变成了只删除链表中间的节点。(图:引用“代码随想录”)
然后解题过程中对于当前节点和next的节点就分不清楚了,一直在用node和nextnode指代不清楚,用pre和current会更加清楚。
/**
* 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) {
// 创建一个虚拟头节点,指向原链表头部
ListNode dummy = new ListNode(0);
dummy.next = head;
// 用两个指针遍历链表,prev和current
ListNode prev = dummy;
ListNode current = head;
while (current != null) {
if (current.val == val) {
// 如果当前节点需要删除,前一个节点指向下一个节点
prev.next = current.next;
} else {
// 如果不需要删除,则更新prev
prev = current;
}
// 无论如何,current继续往后走
current = current.next;
}
// 返回链表的新头节点,即dummy的下一个节点
return dummy.next;
}
}
707.设计链表
题目链接:力扣题目链接
思路:看到题目是蒙的,不会创建“ListNode”类。还有关键要初始化“MyLinkedList”,其他的只要注意控制size边界即可。
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {
this.val = val;
}
}
class MyLinkedList {
ListNode head;
int size;
public MyLinkedList() {
head = new ListNode(0); // 初始化虚拟头结点
size = 0;
}
}
206.反转链表
题目链接:力扣题目链接
思路:两个指针一个前一个后不停交换位置,往之前的队尾推进。重点在翻转之后的node中的next如何指向。需要一个temp暂存current的next,很巧妙。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode current = head;
ListNode temp = null;
while(current != null){
temp = current.next;
current.next = pre;
pre = current;
current = temp;
}
return pre;
}
}