指针La和Lb分别是两个带头节点单链表的头指针,将表La的第i个元素其len个元素删除并插入到表Lb的第j(j>=1)个元素之前。
La : a->b->c->d
Lb : e->f->g->h
将La中的第i个元素开始的Len个元素插入到Lb中的第j个位置
- 初始化两个指针 pre 和 p,分别指向 La 的头节点和第一个元素节点。
- 遍历链表 La,找到第 i-1 个节点,pre 将指向它,p 将指向第 i 个节点(即要删除的第一个节点)。
- 继续遍历 La,直到找到第 i+len-1 个节点,s 指针指向它,这是要删除的最后一个节点。
- 更新 pre->next 指向 s->next,这样就从 La 中移除了 len 个节点。
- 初始化指针 q 指向 Lb 的头节点。
- 遍历链表 Lb,找到第 j-1 个节点,q 将指向它。
- 更新 s->next 指向 q->next,并将 q->next 更新为 p,这样就将删除的元素插入到 Lb 的第 j 个元素之前。
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void insertsub(LNode *La,LNode *Lb,int i,int j,int len)
{
LNode *pre=La;//pre指向表La的头节点
LNode *p=La->next;//p指向表La的头节点后的第一个元素
int k=1;
while(k<i)//遍历到La到第i-1个元素,pre指向第i-1个元素,p指向的i个元素
{
pre=p;
p=p->next;
k+=1;
}
LNode *s=p;//s节点指向La的第i个元素
k=1;
while(k<len)//让s节点指向La的第i+len个元素
{
s=s->next;
k+=1;
}
pre->next=s->next;//删除从La的第i个元素起的后len个元素
LNode *q=Lb;//q指向Lb的头节点
k=0;
while(k<j-1)//令q指向Lb的第j-1个节点
{
q=q->next;
k+=1;
}
s->next=q->next;//将La的第i+len-1个元素插入到Lb到第j个元素之前
q->next=p;
}