代码随想录算法训练营第3天| 203. 移除链表元素、206. 反转链表
移除链表元素
力扣题目链接
删除链表中等于给定值 val 的所有节点。
这里以链表 1 4 2 4 来举例,移除元素4。
那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢?
这里就涉及如下链表操作的两种方式:
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
来看第一种操作:直接使用原来的链表来进行移除。
/**
* @description: 移除链表元素
* @author: 刘宇浩
* @date: 2023/1/6 0:28
*/
public class RemoveLinkedListElement {
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
ListNode current = head;
while (current != null) {
while (current.next != null && current.next.val == val) {
current.next = current.next.next;
}
current = current.next;
}
return head;
}
}
反转链表
力扣题目链接(opens new window)
反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。
其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:
/**
* @description: 反转链表
* @author: 刘宇浩
* @date: 2023/1/6 21:23
*/
public class ReverseLinkedList {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode temp = null;
ListNode curr = head;
while (curr != null) {
temp = curr.next;
curr.next = pre;
pre = curr;
curr = temp;
}
return pre;
}
}
e = curr;
curr = temp;
}
return pre;
}
}