一、有一个整数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) {
//如果A为空,插入后的结点,自己指向自己
if(A.size()==0){
ListNode *node=new ListNode(val);
node->next=node;
return node;
}
//A不为空,创建一个链表
ListNode *head=new ListNode(A[0]);
ListNode *h1=head;
for(int i=1;i<A.size();i++){
h1->next=new ListNode(A[i]);
h1=h1->next;
}
h1->next=NULL;
//从头结点开始寻找
ListNode *pre=head,*cur=head->next;
//如图val小于头结点的数据域,将结点插入到头结点之前,并令插入的结点为头结点
if(pre->val>=val){
ListNode *node=new ListNode(val);
node->next=head;
head=node;
return head;
}
//如果结点cur不为空,并且val在结点pre和cur的数据域之间,将结点插入结点pre和cur之间
while(cur!=NULL){
if(pre->val<=val&&val<=cur->val){
ListNode *node=new ListNode(val);
pre->next=node;
node->next=cur;
break;
}
pre=pre->next;
cur=cur->next;
}
//如果结点cur为空结点,将val插入到结点pre之后
if(cur==NULL){
ListNode *node=new ListNode(val);
pre->next=node;
node->next=NULL;
}
return head;
}
};
二、实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。
给定带删除的头节点和要删除的数字,请执行删除操作,返回删除后的头结点。链表中没有重复数字
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Remove {
public:
ListNode* removeNode(ListNode* pHead, int delVal) {
//第一种情况:删除的节点是头节点
if(pHead->val == delVal){
ListNode *node = pHead->next;
pHead->next = NULL;
return node;
}
ListNode *pre = pHead;
ListNode *cur = pHead->next;
while(cur != NULL)
{
//如果要删除的值为cur
if(cur->val == delVal)
{
//就用cur的下一个值去覆盖当前值
pre->next = cur->next;
cur->next = NULL;
}
pre = pre->next;
cur = cur->next;
}
return pHead;
}
};