在单链表中删除指定值的节点。
题目:给定一个链表的头节点head和一个整数num,请实现函数将值为num的节点全部删除。
例如1->2->3->4->4->null,输出1->2->3->null. num = 4。
1)第一种方法就是用栈来保存值不是num的节点,然后把这些节点进行连接即可。时间和空间都是O(N)。
2)第二种方法就是先找到第一个不是num的节点,然后接着遍历,遍历过程中遇见num删除num ,也就是pre.next = cur. next。时间为O(N),空间为O(1)。
//在单链表中删除指定值的节点。
public class RemoveValue {
public static class Node{
public int value;
public Node next;
public Node(int num){
this.value = num;
}
}
//用栈来保存不是num的节点,然后重新连接即可,时间为O(N),空间也为O(N)
public static Node removeValue1(Node head,int num){
Stack<Node> stack =new Stack<>();
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,删除num,所有需要保存num的前一个节点,也就是不为num的那个节点。
public static Node removeValue2(Node head,int num){
//找到第一个节点不是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;
}