有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。
给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值。
测试样例:
[1,3,4,5,7],[1,2,3,4,0],2
返回:{1,2,3,4,5,7}
代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class InsertValue {
public:
ListNode* insert(vector<int> A, vector<int> nxt, int val) {
assert(A.size() == nxt.size());
ListNode *head = NULL;
construct_list(A, nxt, head);
insert_to_list(head, val);
if(head->next == head)
head->next = NULL;
else{
ListNode* tmp = head;
while(tmp->next != head){
tmp = tmp->next;
}
tmp->next = NULL;
}
return head;
}
private:
void construct_list(vector<int>& A, vector<int>& nxt, ListNode*& head){
head = new ListNode(A[0]);
ListNode* tmp = head;
for(int i=0; i<nxt.size()-1; ++i){
tmp->next = new ListNode(A[nxt[i]]);
tmp = tmp->next;
}
tmp->next = head;
}
void insert_to_list(ListNode*& head, const int& val){
ListNode* new_node = new ListNode(val);
if(head == NULL){
head = new_node;
head->next = head;
}
else if(val <= head->val){
ListNode* tmp = head;
while(tmp->next != head){
tmp = tmp->next;
}
tmp->next = new_node;
new_node->next = head;
head = new_node;
}
else{
ListNode* tmp = head;
while(tmp->next != head && val > tmp->next->val){
tmp = tmp->next;
}
new_node->next = tmp->next;
tmp->next = new_node;
}
}
};
很简单的一道题,就是要注意插入时一定要分三种情况!
1.链表为空,直接插在头部,并作为head返回。
2.插入元素小于head的元素,插于头部之前。必须先遍历到最后一个结点,再插入,并修改头部,然后返回!
3.插入元素在中间或者在尾部,在中间就是普通插入方法,在尾部意思就是它是所有元素最大的元素,插入尾部后让它的next指向head,但是,不更新head!这就是和2情况的不同,所以2和3情况不能完全合并!必须在情况2中更新head!
注意:插入时小技巧就是比较的是tmp->next而不是tmp,这样就可以很轻松的插入一个元素,而不必用额外头prev_tmp保存前驱结点了!