欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-04-01 22:50:10
本文实例讲述了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程序设计有所帮助。