算法总结之 在单链表中删除指定值的节点
给定一个链表的头节点head和一个整数num,请实现函数将值num的节点全部删除
方法一 利用栈或者其他容器收集的方法 时间复杂度O(N) 额外空间复杂度O(N)
将值不等于num的节点收集起来!!!哈哈哈哈哈哈哈哈哈哈啊哈哈哈哈啊哈哈 最后将占地的节点作为新的头节点返回
package TT;
import java.util.Stack;
public class Test109 {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node removeValue1(Node head, int num){
Stack<Node> stack = new Stack<Node>();
while(head!=null){
if(head.value !=num){
stack.push(head);
}
head=head.next;
}
while(!stack.isEmpty()){
stack.peek().next=head;
head=stack.pop();
}
return head;
}
}
方法二 直接调整
首先从链表头开始,找到第一个值不等于num的节点,作为新的头节点,这个节点是肯定不用删除的,记为newHead。
继续往后遍历 假设当前节点为cur 如果cur节点值等于num,就将cur节点删除,如果不等于num 就令pre=cur 更新最近一个值不等于num的节点
package TT;
public class Test110 {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node removeValue2(Node head, int num){
while(head !=null){
if(head.value != num){
break;
}
head=head.next;
}
Node pre = head;
Node cur = head;
while(cur!=null){
if(cur.value==num){
pre.next=cur.next;
}else {
pre=cur;
}
cur=cur.next;
}
return head;
}
}