题目
题目分析
题目给我们的链表,是一个无线循环的链表。【形成一个“环”】
要求我们 在不影响原先升序的情况下,插入一个指定 val 值 的节点。 返回值还是返回 题目给的 head。
解题思维
要求我们在不影响原先链表的升序情况下,插入一个 指定val值的节点。
而且题目给我们head 只是 链表中任意的一个节点,此节点val值,可是最大的,也可能是最小的,又可能是不大不小的那个。
那么,根据题目所给head:
那么,以它为基础。在它后面插入一个节点。【注意这里是单向链表,在没有的值前一个节点的val值的情况下,是不能在 head节点的前面插入的节点。很可能会影响原先链表的升序排列】
那么了,会有以下三种情况:
另外还有一种特殊情况: 链表为 空【链表内没有节点】,此时就是直接创造一个 insertVal 节点,将其 next 值 置为 本身,让它自身成为 一个“环” / 一个循环。
代码如下:
class Solution {
public Node insert(Node head, int insertVal) {
// 特殊情况
if(head == null){
head = new Node(insertVal);
head.next = head;
return head;
}
Node cur = head;
Node flag = null;
while(cur != flag){
if(flag == null){
// 标记 head 头节点位置,作为后面跳出循环的条件
flag = head;
}
// 情况 1 和 情况 2
if((cur.val <= insertVal && cur.next.val >= insertVal) || (cur.val > cur.next.val && (insertVal>=cur.val || insertVal <= cur.next.val))){
Node node = new Node(insertVal,cur.next);
cur.next = node;
return head;
}
cur = cur.next;// 遍历链表,寻找符合 条件 的节点
}
// 情况 3
Node node = new Node(insertVal,cur.next);
cur.next = node;
return head;
}
}