算法总结之 在单链表中删除指定值的节点

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

  

  

 

posted @ 2017-09-11 14:20  toov5  阅读(1663)  评论(0编辑  收藏  举报