高分悬赏:Java语言怎么交换两个双向链表,首先请给出链表的设计类,然后再交换!
问题描述:
高分悬赏:Java语言怎么交换两个双向链表,首先请给出链表的设计类,然后再交换!
答
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);
}
}
}