ZBLOG

使用单链表的其他方法实现该代码,代码调换顺序的规则不变:#ifndef NULL #define NULL 0 #endif #include using namespace std; //定义单链表结点结构 struct LNode { int data; LNode* next; LNode() {}; LNode(int e, LNode* n = NULL) :data(e), next(n) {}; }; //单链表list类创建 class Li...

以下是使用另一种方法实现相同功能的代码,其中单链表结点结构和 List 类的定义保持不变:

#ifndef NULL
#define NULL 0
#endif

#include<iostream>
using namespace std;

//定义单链表结点结构
struct LNode
{
    int data;
    LNode* next;
    LNode() {};
    LNode(int e, LNode* n = NULL) :data(e), next(n) {};
};

//单链表list类创建
class List
{
protected:
    LNode* head;
    int _size;
public:
    //构造函数
    List() {
        head = new LNode;
        head->next = NULL;
        _size = 0;
    }
    
    //析构函数
    ~List() {
        while (head)
        {
            LNode* p = head->next;
            delete head;
            head = p;
        }
    };

	//在指定位置插入元素
	void insert(int index, int a)
	{
		if (index < 1 || index > _size + 1)
		{
			return; // 无效的插入位置,直接返回
		}

		LNode* p = head;

		// 移动 p 到要插入位置的前一个节点
		for (int i = 1; i < index; i++)
		{
			p = p->next;
		}

		LNode* tmp = new LNode(a);

		tmp->next = p->next;
		p->next = tmp;

        _size++;
        
        print_L(); // 打印链表元素值(调试用)
        
        return; // 插入成功
	}

	void print_L()
	{
		LNode* p = head->next;
		while (p != NULL)
		{
			cout << p->data << " ";
			p = p->next;
		}
		cout << endl;
	}

	int change()
    {
        int x, y;
        cin >> x >> y;
        if (x<0 || x>_size || y<0 || y>_size)
        {
            cout << "error" << endl;
            return -1;
        }

        if (x == y) // 如果交换位置相同,直接返回
            return 0;

        LNode* px_prev = head; // 第一个要交换的结点的前一个结点
        for (int i = 0; i < x - 1; i++)
        {
            px_prev = px_prev->next;
        }
        
        LNode* py_prev = head; // 第二个要交换的结点的前一个结点
        for (int j = 0; j < y - 1; j++)
        {
            py_prev = py_prev->next;
        }

	    LNode* px = px_prev->next; // 第一个要交换的结点
	    LNode* py = py_prev->next; // 第二个要交换的结点

	    LNode* tmp_next_px = px->next; // 记录第一个要交换结点后续的指针
	    px_prev->next = py; // 将第二个要交换的结点链接到第一个要交换结点之前(px之前)
	    
	    if(px == py_prev) { // 如果两个要交换的结点相邻
	        px->next = py->next; // 将第二个要交换结点的后续指针链接到第一个要交换结点之后(py之后)
	    } else {
	        px->next = py->next; // 将第二个要交换结点的后续指针链接到第一个要交换结点之后
	        py_prev->next = px; // 将第一个要交换的结点链接到第二个要交换结点之前(py之前)
	    }
	    
	    py->next = tmp_next_px; // 将记录的px后续指针链接到py之后

        print_L(); // 打印链表元素值(调试用)

        return 0;
    };
};

int main()
{
	List LB;
	int n, a;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a;
		LB.insert(i + 1, a);
	}
	
	int t;
	cin >> t;
	for (int i = 0; i < t; i++)
	{
		int a = LB.change();
		if (a == -1)
			continue;
	}	

	return 0;
}

这段代码通过在指定位置插入元素来构建单链表,实现了两个节点位置交换的功能。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9578

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?