将一个带头结点的单链表A分解为两个带头结点的单链表 A和B,使得A表中含有原表 中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变

请问本道题可以这么解吗:节点指向的是奇数,保留在A表中,若指向的是偶数添加到B表中并将A中的删除

img

题目要求是序号判断奇偶,你是数据域判断奇偶

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/166858
  • 这篇博客你也可以参考下:从键盘输入一个字符串a,并在a串中的最大字符元素后边插入字符串b
  • 除此之外, 这篇博客: 算法笔记 5.6 大整数运算 大整数的加减乘除中的 a-b实例 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    我认为你的思考方法是正确的。以下是一个可能的解决方案的代码实现,假设链表的节点数据类型为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;
}