请问本道题可以这么解吗:节点指向的是奇数,保留在A表中,若指向的是偶数添加到B表中并将A中的删除
题目要求是序号判断奇偶,你是数据域判断奇偶
不知道你这个问题是否已经解决, 如果还没有解决的话:我认为你的思考方法是正确的。以下是一个可能的解决方案的代码实现,假设链表的节点数据类型为Node
,其中存在一个getData()
方法返回节点指向的元素值。
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
def getData(self):
return self.data
def separateLinkedList(A):
# 创建B表的头结点
B_head = Node()
# 设置指针变量指向A表的头结点
current = A
# 设置指针变量指向A表的头结点的下一个节点
a = A.next
# 设置指针变量指向B表的头结点
b = B_head
while a is not None:
# 检查当前节点指向的元素是否是奇数
if a.getData() % 2 != 0:
# 如果是奇数,将该节点添加到A表中
current.next = a
current = current.next
else:
# 如果是偶数,将该节点添加到B表中
b.next = a
b = b.next
# 记录下一个节点
a = a.next
# 设置链表A和链表B的尾节点的next为None
current.next = None
b.next = None
return A, B_head
使用示例:
# 创建链表A
A = Node() # 头结点
A.next = Node(1)
A.next.next = Node(2)
A.next.next.next = Node(3)
A.next.next.next.next = Node(4)
A.next.next.next.next.next = Node(5)
# 分解链表A为链表A和链表B
A, B = separateLinkedList(A)
# 打印链表A中的元素
current = A.next
while current is not None:
print(current.getData())
current = current.next
# 打印链表B中的元素
current = B.next
while current is not None:
print(current.getData())
current = current.next
运行上述示例代码,你将会看到链表A中包含原表中序号为奇数的元素(1, 3, 5),链表B中包含原表中序号为偶数的元素(2, 4)。这样就完成了将链表A分解为A和B的要求。
这么写,供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;//声明节点类型
}LinkNode;
void DispList(LinkNode* L)
{
LinkNode* p = NULL;
if (!L || !L->next)
printf("NULL");
else {
p = L->next;
while (p != NULL)
{
printf(p == L->next ? "%d" : "->%d", p->data);
p = p->next;
}
}
printf("\n");
}
void CreatList(LinkNode** L)
{
ElemType data;
LinkNode* pt = NULL, * pL = NULL;
(*L) = (LinkNode*)malloc(sizeof(LinkNode));
(*L)->next = NULL;
pL = (*L);
while (1) {
scanf("%d", &data);
if (data == -1) break;
pt = (LinkNode*)malloc(sizeof(LinkNode));
pt->next = NULL;
pt->data = data;
pL->next = pt;
pL = pt;
}
}
void Split(LinkNode* L1, LinkNode** L2)
{
LinkNode* pL1 = NULL, * prL1 = NULL, * ptL = NULL, * pL2 = NULL;
int cnt = 0;
if (!L1 || !L1->next) return;
(*L2) = (LinkNode*)malloc(sizeof(LinkNode));
(*L2)->next = NULL;
pL2 = (*L2);
pL1 = L1->next;
prL1 = L1;
while (pL1 != NULL) {
cnt++;
ptL = pL1;
pL1 = pL1->next;
ptL->next = NULL;
if (cnt % 2 != 0) {
prL1->next = ptL;
prL1 = ptL;
}
else {
pL2->next = ptL;
pL2 = ptL;
}
}
}
int main()
{
LinkNode* L1 = NULL, * L2 = NULL;
CreatList(&L1);
DispList(L1);
Split(L1, &L2);
DispList(L1);
DispList(L2);
return 0;
}