1.题目描述: 删除链表中值为 val 的元素
思路:
方法一:
1. 遍历原链表,如果与val值相等,则删除
特殊情况:链表为空时,怎么办
第一个节点head的值,如果等于val,怎么办
2. 需要两个指针,一个 cur 遍历整个链表
一个为 perv 记录 遍历的cur 的 前一个节点(如果遇到需要删除的结点,
需要知道此节点的前一个节点,所以需要prev)
//定义节点
class Node {
int val;
Node next = null;
Node(int val){
this.val = val;
}
//打印链表
@Override
public String toString() {
return String.format("Node(%d)",val);
}
}
public class Practice{
public static Node removeElements(Node head,int val){
//如果链表为空,直接返回null
if(head == null){
return null;
}
//指向 cur 的前一个节点
Node prev = head;
//cur 用于 遍历整个链表
Node cur = head;
while(cur != null){
if(cur.val == val){
prev.next = cur.next;
}else{
prev = cur;
}
cur = cur.next;
}
//如果 head 的值为 val,让 head 指向 head 的 下一个元素
if(head.val == val){
head = head.next;
}
return head;
}
//测试方法 创建一个链表
private static Node test(){
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(1);
Node n4 = new Node(3);
n1.next = n2;
n2.next = n3;
n3.next = n4;
return n1;
}
public static void main(String[] args) {
//删除 val 值 为 1 的 节点
Node head = removeElements(test(),1);
for(Node cur = head;cur != null;cur = cur.next){
System.out.println(cur);
}
}
}
运行结果
方法二:
1.定义一个结果链表result
2.last-------> 指向结果链表的最后一个元素
3.cur-------->用来遍历原链表
思路:
1.如果cur的值与cur不相等
1.1如果链表为空,让result 指向 cur
1.2如果链表不为空,让last.next = cur;
last = cur,使last 指向新链表的最后一个节点
2.如果cur的值与cur相等
让 cur = cur.next;
代码:
public class Practice3 {
public static Node removeElements(Node head,int val){
Node cur = head;
Node result = null;
Node last = null;
while(cur != null){
if(cur.val != val) {
if(result == null){
result = cur;
}else{
last.next = cur;
}
last = cur;
}
cur = cur.next;
}
if(last != null){
last.next = null;
}
return result;
}
}