面试题练习(11)——编写实现双链表删除节点的程序

28 篇文章 0 订阅
15 篇文章 0 订阅

简单例子:

代码:(Node2这个POJO类,在LinkList方法的main调用对应的addNode或delNode方法) 

package EndTest;

import java.io.IOException;
import java.util.Scanner;

/**
 * 
 * @author lenovopc
 *链表:一个链表由很多节点组成,每个节点包含表示内容的数据域和指向下一个节点的链域两部分。
 *正是通过链域将节点连接形成一个表。围绕链表的基本操作有添加节点、删除节点和查找节点等。
 */

public class LinkList {
	  
	  private Node2 head;
	  
	  public LinkList(){
	    this.head = new Node2(0);
	    
	  }
	  
	  public void addNode(int num){
	    Node2 newnode = new Node2(num);
	    Node2 p = head;
	    for(;p.getNext()!=null;p = p.getNext()){}//让p找到末端,在末端加上节点
	    p.setNext(newnode);
	    newnode.setPre(p);
	    if(p.getPre()!=null)
	    	System.out.println("add----num("+num+")----上一个节点"+p.getPre().getNum()+"    数据:"+p.getNum()+"   下一个节点:"+p.getNext().getNum()+"*****临时上节点:"+p.getNext().getPre().getNum()+"   临时数据:"+p.getNext().getNum()+"  临时下节点:"+p.getNext().getNext());
	    else{
	    	System.out.println("add---num("+num+")---上一个节点"+p.getPre()+"    数据:"+p.getNum()+"   下一个节点:"+p.getNext().getNum()+"*****临时上节点:"+p.getNext().getPre().getNum()+"   临时数据:"+p.getNext().getNum()+"   临时下节点:"+p.getNext().getNext());
	    }
	      
	  }
	  
	  public void printInfo(){
	    System.out.println("");
	    for(Node2 p = head.getNext();p!=null;p=p.getNext()){
	      System.out.print(p.getNum() + " ");//初始化,num为0,所以从head.getNext()下一节点的num开始,,,,遍历下节点
	    }
	    
	    System.out.println("");
	    Node2 p = head;
	    for(;p.getNext()!=null;p = p.getNext()){}//找到p的末端
	    for(;p!=null && p!=head;p=p.getPre()){//遍历上节点
	      System.out.print(p.getNum() + " ");
	    }
	  }
	  
	  /**
	   * 删除节点
	   * @param num
	   */
	  public void delNode(int num){
	    for(Node2 p = head.getNext();p!=null;p=p.getNext()){
	      if(p.getNum()==num){// 找到,删除
	        p.getPre().setNext(p.getNext());
	        p.getNext().setPre(p.getPre());
	        p.setNext(null);
	        p.setPre(null);
	      }
	    }
	    
	  }
	  
	  static int MAX=10;
	  public static void main(String[] args) {
		  //编写实现双链表删除节点的程序
	    LinkList ll = new LinkList();
	    ll.addNode(3);
	    ll.addNode(5);
	    ll.addNode(7);
	    ll.addNode(9);
	    
	    ll.printInfo();
	    
	    ll.delNode(5);
	    
	    ll.printInfo();
		  
}
	class Node2{
	  private int num;
	  
	  private Node2 next;
	  
	  private Node2 pre;
	  
	  public Node2(int num){
	    this.num = num;
	    this.next = null;
	    this.pre = null;
	  }

	  public Node2 getNext() {
	    return next;
	  }

	  public void setNext(Node2 next) {
	    this.next = next;
	  }

	  public Node2 getPre() {
	    return pre;
	  }

	  public void setPre(Node2 pre) {
	    this.pre = pre;
	  }

	  public int getNum() {
	    return num;
	  }    
	}

打印结果:

图解:

添加节点:

删除节点:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yvette_QIU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值