Java实现双链表互相交换任意两个节点的方法示例

 更新时间:2017年11月11日 09:55:39   作者:Dzwsss  
这篇文章主要介绍了Java实现双链表互相交换任意两个节点的方法,简单讲述了双链表的概念,并结合实例形式给出了java双链表实现任意两个节点交换的操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现双链表互相交换任意两个节点的方法。分享给大家供大家参考,具体如下:

概述:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

思路:

1、确定两个节点的先后顺序
2、next、prev互相交换顺序以及将换向前方的节点与之前的节点对接。(1.prev.next = 2)
3、判断是否相邻

实现代码:

链表类:

public class SLink {
  public SNode head;
  public SLink() {
    this.head = new SNode();
  }
  public boolean interChangeById(int id1,int id2) {
    SNode s = head;
    SNode node1 = null,node2 = null;
    int node1Count,node2Count;
    node1Count = node2Count = 0;
    if(id1 == id2) {
      return true;
    }
    /**
     * 向下遍历
     */
    while (s.next != null) {
      s = s.next;
      node1Count ++ ;
      if(s.student.stuId == id1) {
        /**
         * 记录节点1
         */
        node1 = s;
        break;
      }
    }
    s = head;
    while (s.next != null) {
      s = s.next;
      node2Count ++ ;
      if(s.student.stuId == id2) {
        /**
         * 记录节点2
         */
        node2 = s;
        break;
      }
    }
    if(node1 != null && node2 != null) {
      SNode temp = new SNode();
      /**
       * node1在后
       */
      if(node1Count > node2Count) {
        temp.next = node1.next;
        temp.prev = node1.prev;
        /**
         * 记录那个节点就先处理那个节点
         * 1、交换next
         * 2、交换prev
         * 3、设置之前节点的next(对接)
         */
        node1.next = node2.next;
        node1.prev = node2.prev;
        node2.prev.next = node1;
        if(node1.next.equals(node1)) {
          /**
           * 说明两个节点相邻
           */
          node1.next = node2;
          node2.next = temp.next;
          node2.prev = node1;
        }else {
          /**
           * 说明节点不相邻
           */
          node2.next = temp.next;
          node2.prev = temp.prev;
          temp.prev.next = node2;
        }
      }else {
        /**
         * node1在前
         */
        temp.next = node2.next;
        temp.prev = node2.prev;
        node2.next = node1.next;
        node2.prev = node1.prev;
        node1.prev.next = node2;
        if(node2.next.equals(node2)) {
          node2.next = node1;
          node1.next = temp.next;
          node1.prev = node2;
        }else {
          node1.next = temp.next;
          node1.prev = temp.prev;
          temp.prev.next = node1;
        }
      }
      return true;
    }
    return false;
  }
  public void displayStudent() {
    SNode s = head;
    while (s.next != null) {
      s = s.next;
      System.out.println(s.student);
    }
  }
}

节点类:

public class SNode {
  public Student student;
  public SNode next;
  public SNode prev;
  public SNode(Student student, SNode prev,SNode next) {
    this.student = student;
    this.next = next;
    this.prev = prev;
  }
  public SNode() {
    this.student = null;
    this.next = null;
    this.prev = null;
  }
}

Student类:

public class Student {
  public int stuId;
  public String name;
  public int age;
  public String className;
  public Student(int stuId, String name, int age, String className) {
    this.stuId = stuId;
    this.name = name;
    this.age = age;
    this.className = className;
  }
  public int getStuId() {
    return stuId;
  }
  public void setStuId(int stuId) {
    this.stuId = stuId;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getClassName() {
    return className;
  }
  public void setClassName(String className) {
    this.className = className;
  }
  @Override
  public String toString() {
    return "Student{" +
        "stuId=" + stuId +
        ", name='" + name + '\'' +
        ", age=" + age +
        ", className='" + className + '\'' +
        '}';
  }
}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

您可能感兴趣的文章:

相关文章

  • logback.xml动态配置程序路径的操作

    logback.xml动态配置程序路径的操作

    这篇文章主要介绍了logback.xml动态配置程序路径的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java selenium 操作弹出窗口示例代码

    java selenium 操作弹出窗口示例代码

    本文主要介绍java selenium 操作弹出窗口,这里实例讲解操作弹出窗口详细流程,并附示例代码,有需要的小伙伴可以参考下
    2016-08-08
  • 浅谈hibernate之映射文件VS映射注解

    浅谈hibernate之映射文件VS映射注解

    下面小编就为大家带来一篇浅谈hibernate之映射文件VS映射注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    这篇文章主要介绍了JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现的相关资料,需要的朋友可以参考下
    2016-03-03
  • SpringBoot源码 PropertySource解析

    SpringBoot源码 PropertySource解析

    PropertySource是spring中对于键值属性的一种抽象,主要是name和sourcePropertyResolver是对PropertySource提供对外的统一数据处理,对于占位符的处理委托于PropertyPlaceholderHelper,对Springboot 源码 PropertySource相关知识感兴趣的朋友一起看看吧
    2023-01-01
  • Java使用JDBC连接Oracle_MSSQL实例代码

    Java使用JDBC连接Oracle_MSSQL实例代码

    这篇文章主要介绍了Java使用JDBC连接Oracle_MSSQL实例代码,需要的朋友可以参考下
    2014-01-01
  • Token安全存储的几种方式小结

    Token安全存储的几种方式小结

    在现代 Web 应用中,身份认证与授权是确保系统安全性的重要部分,Token被广泛应用,作为实现身份认证的主要方式,然而,如何安全地存储这些 Token,是每个开发者在构建前端应用时必须考虑的问题,本文将深入探讨Token安全存储的几种方式,需要的朋友可以参考下
    2025-04-04
  • 使用Prometheus监控Tomcat等java应用的状态

    使用Prometheus监控Tomcat等java应用的状态

    本文介绍了如何配置Tomcat监控,使用JMX Exporter和Prometheus进行监控,并通过Grafana展示监控数据
    2024-12-12
  • mybatis模糊查询like语句该如何写

    mybatis模糊查询like语句该如何写

    MyBatis模糊查询通常使用LIKE关键字,结合concat函数拼接通配符%实现,在MyBatis配置文件中,通过#{keyword}传递参数,生成带有通配符的查询语句,MyBatis-Plus中,通过LambdaQueryWrapper类和like方法构建模糊查询条件,简化查询操作
    2024-09-09
  • idea中引入了gb2312编码的文件的解决方法

    idea中引入了gb2312编码的文件的解决方法

    这篇文章主要介绍了idea中引入了gb2312编码的文件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论