题目:
要求
不再创建新的链表
思路
设原链表为L,a元素链表为l1,b元素链表为l2。
对于l1的操作:只要l2的节点不为空,那么l1就能跨节点指向l2指向的下一个节点位置,再更新l1节点位置。
对于l2的操作:只要l1当前节点不是空节点,那么就可以指向l1所指向的节点。
总结下来就是只要后节点不是空节点,那么前节点就可以指向后节点所指向的节点位置。
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct LNode{
int value;
struct LNode* next;
}Lnode, *LinkList;
void initLinkList(LinkList& L){
L = (LinkList)malloc(sizeof(LNode));
L -> next = NULL;
}
//获取第i个元素的值
int getElement(LinkList l,int k)
{
Lnode* p = l -> next;
int j = 1;
while(p && j ++< k){
p = p -> next;
}
return p -> value;
}
// 在第k个节点处加入一个新的节点
void addElement(LinkList l,int k,int x)
{
Lnode* p = l;
int j = 0;
while(p && j ++< k - 1){
p = p -> next;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
s -> value = x;
s -> next = p -> next;
p -> next = s;
}
// 删除第k个节点
void deleteNode(LinkList& l,int k)
{
int j = 0;
while(l && j ++ < k - 1)
{
l = l -> next;
}
l -> next = l -> next -> next;
}
// 遍历一遍链表
void show(LinkList l)
{
LinkList p = l -> next;
while(p)
{
cout << p -> value << " ";
p = p -> next;
}
}
int main()
{
LinkList l;
initLinkList(l);
addElement(l,1,2);
addElement(l,1,3);
addElement(l,1,1);
addElement(l,1,5);
addElement(l,1,5);
addElement(l,1,5);
addElement(l,1,9);
addElement(l,1,11);
show(l);
cout << endl;
LinkList l1 = l;
LinkList r1 = l1 -> next;
l1 = l1 -> next;
LinkList l2 = l1 -> next;
LinkList r2 = l2;
while(l2 && l1)
{
if(l1 -> next){
l1 -> next = l1 -> next -> next;
}
l1 = l1 -> next;
// 先要确保l1不为空
if(l1){
l2 -> next = l1 -> next;
}
else{
l2 -> next = NULL;
}
l2 = l2 -> next;
}
while(r1)
{
cout << r1 -> value << ' ';
r1 = r1 -> next;
}
cout << endl;
while(r2)
{
cout << r2 -> value << ' ';
r2 = r2 -> next;
}
}
难点
这种题目两种情况,一个是链表元素为偶数个,一个是链表元素为奇数个。
本人第一次写只过了奇数个,到了偶数个出现指针指向问题的报错。花了点时间发现更新完l1后没有再对l1进行判断就更改了l2的值。