B. DS单链表--结点交换

【题目描述】

用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置。

注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换

交换函数定义可以参考:

swap(int  pa, int pb)  //pa和pb表示两个结点在单链表的位置序号

swap (ListNode * p, ListNode * q)  //p和q表示指向两个结点的指针

【输入】

第1行先输入n表示有n个数据,接着输入n个数据

第2行输入要交换的两个结点位置

第3行输入要交换的两个结点位置

【输出】

第一行输出单链表创建后的所有数据,数据之间用空格隔开

第二行输出执行第1次交换操作后的单链表数据,数据之间用空格隔开

第三行输出执行第2次交换操作后的单链表数据,数据之间用空格隔开

如果发现输入位置不合法,输出字符串error,不必输出单链表

【输入样例

5 11 22 33 44 55
1 4
2 6

【输出样例】

11 22 33 44 55 \n
44 22 33 11 55 \n
error\n

#include<iostream>
using namespace std;
class ListNode {
public:
	int data;
	ListNode* next;
	ListNode(){
		next = NULL;
	}
};
class LinkList {
public:
	ListNode* head;
	int len;
	LinkList() {
		head = new ListNode();
		len = 0;
	}
	~LinkList() {
		ListNode* p = head;
		ListNode* q;
		while (p != NULL) {
			q = p;
			p = p->next;
			delete q;
		}
		len = 0;
		head = NULL;
	}
	ListNode* LL_index(int i);
	int LL_insert(int i, int item);
	int LL_swap(int pa, int pb);
	void LL_display();
};
ListNode* LinkList::LL_index(int i) {
	ListNode* p = head;
	if (i == 0) {
		return p;
	}
	int j = 1;
	p = p->next;
	while ((p != NULL) && (j < i)) {
		p = p->next;
		j++;
	}
	if ((p == NULL) || (i < j)) {
		return 0;
	}
	else {
		return p;
	}
}
int LinkList::LL_insert(int i, int item) {
	if ((i <= 0) || (i > len + 1)) {
		return 0;
	}
	ListNode* p = LL_index(i - 1);
	if (p == NULL) {
		return 0;
	}
	ListNode* s = new ListNode();
	s->data = item;
	s->next = p->next;
	p->next = s;
	len++;
	return 1;
}
int LinkList::LL_swap(int pa, int pb) {
	if ((pa <= 0) || (pa > len) || (pb <= 0) || (pb > len)) {
		return 0;
	}
	ListNode* p = LL_index(pa - 1);
	ListNode* q = LL_index(pb - 1);
	//考虑pa,pb相邻
	if (p->next == q) {//少一个等号!!!
		p->next = p->next->next;
		q->next = p->next->next;
		p->next->next = q;
		return 1;
	}
	//保存pa位,先交换前驱
	ListNode* s = p->next;
	p->next = q->next;
	q->next = s;
	//保存pb下一位,交换后继
	s = p->next->next;
	p->next->next = q->next->next;
	q->next->next = s;
	return 1;
}
void LinkList::LL_display() {
	ListNode* p = head->next;
	while (p) {
		cout << p->data << " ";
		p = p->next;//竟然忘记了,无止境输出11
	}
	cout << endl;
}
int main() {
	int len, item;
	cin >> len;
	LinkList mylist;
	for (int i = 1; i <= len; i++) {
		cin >> item;
		mylist.LL_insert(i, item);
	}
	mylist.LL_display();
	int times = 2;
	int pa, pb;
	while (times--) {
		cin >> pa >> pb;
		if (mylist.LL_swap(pa, pb) == 1) {
			mylist.LL_display();
		}
		else {
			cout << "error" << endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值