本章节的内容都是在idea中能够正常运行出来的。
指定区间链表反转
借图,来进行理解,可以算是双指针问题,prve指针在7的位置不动,cur指针在2的位置上(一直是指着2的)。
解决:先找到要反转节点的前一个节点prve,和要反转节点的位置cur,然后把cur后面的节点保存起来,然后删除该节点,然后用保存的节点进行插入prve和cur中间(此时cur还是指着2的)。然后重复right-left得到循环的次数,循环保存节点,删除节点,插入节点。
//链表的反转指定节点 插头法,
public void reverseLisetRL(int left,int right){
//设置呀节点,并返回找到头节点的作用,否则left=1的时候找不到头节点(插头法的原因,当然也可以不涉及呀节点,但会在1节点的位置会有些变化,需要在讨论的情况)
Node dummy = new Node(-1);
//呀节点连接头节点,
dummy.next = head;
Node prve = dummy;
for (int i = 0; i < left - 1; i++) {
prve = prve.next;
}
Node cur = prve.next;
Node next;
for (int i = 0; i < right - left; i++) {
//删除节点的方式,但是为了防止节点找不到,所以必须保存下这个节点。
next = cur.next;
//删除节点。
cur.next = next.next;
//将保存的节点进行插入
next.next = prve.next;
prve.next = next;
}
head =dummy.next;
}
两两交换链表中的节点
借图和注解理解
//两两节交换链表中的节点
public void erER(){
//设置呀节点
Node dummy = new Node(0);
//找到返回头节点的位置
dummy.next = head;
//一个助力交换的节点
Node cur = dummy;
//循环条件 循环
while (cur.next!=null&&cur.next.next!=null){
//保存要交换的一个节点
Node next1= cur.next;
//保存要交换的另一个节点
Node next2 = cur.next.next;
//第一次链接 1—>3 位置
cur.next = next2;
//第二次链接 2->4 位置
next1.next = next2.next;
//第三次链接 3->2 位置
next2.next = next1;
//下一次循环的主力节点位置(这里可以换成next2,效果也是两两交换的)
cur = next1;
}
head = dummy.next;
}