链表相关的问题几乎都是coding问题
1)单链表和双链表如何反转
2)把给定值都删除
单链表的反转
初始:
反转后:
基本思路:先申请两个节点类型的pre,next,开始把它俩都设置为空,进入一个循环条件,head不为空时循环不能终止,首先让next指向head的next,意思就是第二个节点,然后head的next指向pre,让pre接住head,依次这样循环。
public static Node reverseLinkedList(Node head){
Node pre = null;
Node next = null;
while (head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
双向链表的反转
初始:
反转后:
代码:
public static DoubleNode reverseDoubleList(DoubleNode head){
DoubleNode pre = null;
DoubleNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
head.last = next;
pre = head;
head = next;
}
return pre;
}
把给定值给删除
分析:因为给的值是随机的,所以很有可能把第一个节点删除掉,所以我们要有返回值,返回到第一个节点,不然这个链表要用的时候就找不到了,首先我们先把头部是要删除的值全部删除,如果没有就直接跳过,然后准备两个节点类型的变量,找到结点之后有前一个节点指向后一个节点,就把要删除的节点孤立出来的,java虚拟机在一定时间检查被孤立的节点由头结点找不到之后就由垃圾回收机制把被孤立的节点删除掉了
代码:
public static Node removeValue(Node head, int num) {
while (head != null) {
if (head.value != num) {
break;
}
head = head.next;
}
Node pre = head;
Node cur = head;
while (cur != null) {
if (cur.value == num) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return head;
}