今日题目:链表基础
203.移除链表元素
题目描述:删除所有满足节点值=val的节点
解题思路:
- 因为链表节点只保存了下一个节点目标,故需要双指针,curr指针记录当前遍历的指针,pre指针保存当前遍历指针的上一个节点,引入虚拟头节点处理边界情况即可
代码:
class Solution {
public ListNode removeElements(ListNode head, int val) {
// 双指针: 引入虚拟头节点处理边界情况
ListNode dumy = new ListNode(-1, head);
ListNode pre = dumy;
ListNode curr = head;
while(curr != null){
if(curr.val == val){
pre.next = curr.next;
}else pre = pre.next;
curr = curr.next;
}
return dumy.next;
}
}
707.设计链表
题目描述:设计一个单链表或者双向链表
解题思路:借用Java实现好的数据结构LinkedList
代码:
class MyLinkedList {
LinkedList<Integer> list;
public MyLinkedList() {
list = new LinkedList<>();
}
public int get(int index) {
int size = list.size();
if(index >= size) return -1;
return list.get(index);
}
public void addAtHead(int val) {
list.addFirst(val);
}
public void addAtTail(int val) {
list.addLast(val);
}
public void addAtIndex(int index, int val) {
// 超出链表范围, 不执行插入操作
if(index > list.size()) return;
// 指定位置插入元素
list.add(index, val);
}
public void deleteAtIndex(int index) {
if(index >= list.size()) return;
list.remove(index);
}
}
206.反转链表
经典题目: 双指针,一个指针pre初始为null,一个指针curr遍历当前节点,对于每个节点,都将curr指向pre即可
代码:
class Solution {
public ListNode reverseList(ListNode head) {
// 引入虚拟头节点为 null, 避免有环
ListNode pre = null;
ListNode curr = head;
while(curr != null){
ListNode temp = curr.next;
curr.next = pre;
// 指针后移
pre = curr;
curr = temp;
}
return pre;
}
}