【java-面试题】链表刷题
- 1. 删除链表中等于给定值 val 的所有节点(最多遍历链表一遍)
- 题目
- 思路
- 代码
- 2. 反转一个单链表(就地反转)
1. 删除链表中等于给定值 val 的所有节点(最多遍历链表一遍)
力扣链接:203.移除链表元素
题目
思路
- 遍历单链表中所有结点
- 遍历的同时把结点中的元素和val比较,
- 和val相等,删除该结点后继续向后遍历
- 和val不相等,继续向后遍历
要注意的是:
- 怎么删除结点:
- 找到要删除结点的前驱
- 连接要删除结点的前驱和后继:把要删除结点中存储的后继的地址存储到要删除结点的前驱中。
- 遍历的同时还要确定前驱,这种情况如何遍历?
创建变量prev从一号结点开始遍历,创建变量cur从二号结点开始遍历。cur是当前结点,prev是当前结点的前驱。遍历结束后,再单独检查一号结点中元素是否与key相等。
-
头结点必须放到最后处理:如果先判断头结点,再判断后面的元素,若头结点是要删除的元素,删除头结点后,在删后面元素的时候,还是会从第二结点(也就是新的头结点)开始遍历。此时若新的头结点还是要删除的元素,删完头结点后,新的头结点依然会遗漏。如果非要先判断头结点再判断后面元素,就搞个循坏,先删头结点,直到新的头结点不是要删除的元素,再删后面的元素。
-
链表为空时,返回空链表。
代码
/**
* 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) {
//链表为空时
if(head == null){
return null;
}
ListNode prev = head;
ListNode cur = head.next;//从第二个结点开始遍历
while(cur != null){
if(cur.val == val){
prev.next = cur.next;
cur = cur.next;
}else{
prev = prev.next;
cur = cur.next;
}
}
if(head.val == val){
head = head.next;//最后处理头结点
}
return head;
}
}