给定一个链表的头节点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; } }