向有序的环形单链表中插入新节点
题目描述
一个环形单链表从头节点 head 开始不降序,同时由最后的节点指回头节点。给定这样一个环形单链表的头节点 head 和 一个整数 num, 请生成节点值为 num 的新节点,并插入到这个环形链表中,保证调整后的链表依然有序。
输入描述:
环形单链表的头节点 head 和 一个整数 num。
输出描述:
在给定的函数内返回新的环形单链表的头指针。
示例1
输入
5
1 2 3 4 5
6
输出
1 2 3 4 5 6
备注:
保证链表的长度不大于1000000
题解:
正常插入即可,不过需要考虑一些特殊情况:
- 链表为空;
- num 小于链表首节点的值时需要返回的节点是新创建的节点;
- num 大于链表尾节点的值时需要插入的位置。
代码:
# include <bits/stdc++.h>
using namespace std;
struct list_node{
int val;
struct list_node * next;
};
list_node * input_list(void)
{
int n, val;
list_node * phead = new list_node();
list_node * cur_pnode = phead;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &val);
if (i == 1) {
cur_pnode->val = val;
cur_pnode->next = NULL;
}
else {
list_node * new_pnode = new list_node();
new_pnode->val = val;
new_pnode->next = NULL;
cur_pnode->next = new_pnode;
cur_pnode = new_pnode;
if (i == n) {
new_pnode->next = phead;
}
}
}
return phead;
}
list_node * insert_num(list_node * head, int num)
{
//在下面完成代码
list_node *tmp = new list_node();
tmp->val = num;
tmp->next = NULL;
if (!head) {
tmp->next = tmp;
return tmp;
}
list_node *pre = head, *p = head->next;
while (p != head) {
if (pre->val <= num && p->val >= num) {
break;
}
pre = p;
p = p->next;
}
pre->next = tmp;
tmp->next = p;
return num < head->val ? tmp : head;
}
void print_list(list_node * head)
{
list_node * h = head;
while (1) {
printf("%d ", head->val);
if (head->next == h) break;
head = head->next;
}
puts("");
}
int main ()
{
list_node * head = input_list();
int n;
scanf("%d", &n);
list_node * new_head = insert_num(head, n);
print_list(new_head);
return 0;
}