11.10(24. 两两交换链表中的节点-----61. 旋转链表)

24. 两两交换链表中的节点

思路:略

效率:

程序代码:

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};


class Solution {
public:
	ListNode* swapPairs(ListNode* head) {
		ListNode* tmp1 = head;//指向开头的指针
		if (!head) return NULL;
		ListNode* tmp2 = tmp1->next;
		int tmp;//用于交换的中间变量,整形
		while (tmp1) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
			tmp2 = tmp1->next;
			tmp = tmp1->val;
			tmp1->val = tmp2->val;
			tmp2->val = tmp;
			tmp1 = tmp2->next;
		}
		return head;
	}
	ListNode* create(vector<int> nums) {//创建一个链表
		ListNode* start = new ListNode(0);//先创建一个头结点
		ListNode* tmp = start;
		int m = nums.size();
		int i = 0;
		while (i < m) {
			ListNode *m = new ListNode(nums[i]);//创建一个结点
			tmp->next = m;
			tmp = tmp->next;
			m->next = NULL;
			i++;
		}
		start = start->next;
		return start;//返回头部结点
	}


	void show(ListNode* head) {
		ListNode* a = head;//表示头结点
		while (a) {
			cout << a->val<<"***";
			a = a->next;
		}
		cout << endl;
	}

};



int main() {
	int n;
	cin >> n;//n表示节点的个数
	vector<int> vec(n);
	for (int i = 0; i < n; i++) {
		cin >> vec[i];
	}
	Solution bb;
	ListNode* a = bb.create(vec);
	bb.show(a);
	ListNode *c = bb.swapPairs(a);
	bb.show(c);
	return 0;
}

经过测试,程序运行结果没有问题,但是没法通过官网上的测试,因为我是采用的交换相邻系结点数值的方法而不是真正交换了结点,没有按照题目要求进行。

改进版程序代码:

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};


class Solution {
public:
	ListNode* swapPairs(ListNode* head) {
		ListNode* tmp1 = head;//指向开头的指针
		if (!head) return NULL;
		ListNode* tmp2 = tmp1->next;
		ListNode* tmp = tmp2;//这个
		ListNode *p = NULL;//初始是空指针
		while (tmp1) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
			tmp2 = tmp1->next;
			if (tmp2->next)
				tmp1->next = tmp2->next;
			else tmp1->next = NULL;
			tmp2->next = tmp1;
			if (p)
				p->next = tmp2;
			p = tmp1;
			if (tmp1->next)
				tmp1 = tmp1->next;//纠正一下位置
			else tmp1 = NULL;
		}
		return tmp;//这个才是头结点
	}
	ListNode* create(vector<int> nums) {//创建一个链表
		ListNode* start = new ListNode(0);//先创建一个头结点
		ListNode* tmp = start;
		int m = nums.size();
		int i = 0;
		while (i < m) {
			ListNode *m = new ListNode(nums[i]);//创建一个结点
			tmp->next = m;
			tmp = tmp->next;
			m->next = NULL;
			i++;
		}
		start = start->next;
		return start;//返回头部结点
	}


	void show(ListNode* head) {
		ListNode* a = head;//表示头结点
		while (a) {
			cout << a->val<<"***";
			a = a->next;
		}
		cout << endl;
	}

};



int main() {
	int n;
	cin >> n;//n表示节点的个数
	vector<int> vec(n);
	for (int i = 0; i < n; i++) {
		cin >> vec[i];
	}
	Solution bb;
	ListNode* a = bb.create(vec);
	bb.show(a);
	ListNode *c = bb.swapPairs(a);
	bb.show(c);
	return 0;
}

改进之后仍然没法正确运行,虽然在vs上面都可以正确运行,我也不知道为啥。

再次改进版(通过)

丫的!!!!

class Solution {
public:
	ListNode* swapPairs(ListNode* head) {
		ListNode* tmp1 = head;//指向开头的指针
		if (!head) return NULL;
		ListNode* tmp2 = tmp1->next;
        if(!tmp2) return head;
		ListNode* tmp = tmp2;//这个
		ListNode *p = NULL;//初始是空指针
		while (tmp1&&tmp1->next&&tmp1->next->next) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
			tmp2 = tmp1->next;
			tmp1->next = tmp2->next;
			tmp2->next = tmp1;
			if (p)
				p->next = tmp2;
			p = tmp1;
			tmp1 = tmp1->next;//纠正一下位置
		}
		//再交换最后两个结点
        if(!p&&tmp1&&tmp2){
            tmp2->next=tmp1;
            tmp1->next=NULL;
        }
        if(p&&tmp1->next){
            p->next = tmp1->next;
            p->next->next = tmp1;
		tmp1->next = NULL;
        }
		
		return tmp;//这个才是头结点
	}
	

};

61. 旋转链表

思路:一步一步进行移动

注意:要先对k进行处理,除去没必要进行的移动

效率:50+%

程序代码:

//61. 旋转链表

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
	ListNode* rotateRight(ListNode* head, int k) {
		if (!head) return NULL;//这种讨厌的边界条件
		ListNode* tmp = head;
		int len = 0;
		while (tmp) {
			len++;
			tmp = tmp->next;
		}
		tmp = head;//重新引导
		k = k % len;
		for (int i = 0; i < k; i++) {//执行k步
			Haha(tmp);
		}
		return head;
	}
	
	void Haha(ListNode* tmp) {//表示移动一步的结果
		int a = 0, b = 0;
		ListNode* m = tmp;//表示头节点
		while (tmp) {//表示这个指针有意义
			b = tmp->val;
			tmp->val = a;
			a = b;
			tmp = tmp->next;
		}
		m->val = a;//对头结点进行赋值
	}
	ListNode* create(vector<int> nums) {//创建一个链表
		ListNode* start = new ListNode(0);//先创建一个头结点
		ListNode* tmp = start;
		int m = nums.size();
		int i = 0;
		while (i < m) {
			ListNode *m = new ListNode(nums[i]);//创建一个结点
			tmp->next = m;
			tmp = tmp->next;
			m->next = NULL;
			i++;
		}
		start = start->next;
		return start;//返回头部结点
	}


	void show(ListNode* head) {
		ListNode* a = head;//表示头结点
		while (a) {
			cout << a->val << "***";
			a = a->next;
		}
		cout << endl;
	}



};


int main() {
	int m,k;//表示节点的个数
	cin >> m>>k;
	vector<int> vec(m);
	for (int i = 0; i < m; i++) {
		cin >> vec[i];
	}
	Solution bb;
	ListNode* head = bb.create(vec);
	bb.show(head);
	ListNode* a = bb.rotateRight(head,k);
	bb.show(head);
	return 0;
}



///程序运行时显示超时了,给出的样例[1,2,3]
//2000000000,原来进行了很多没有必要的循环奥,先对k进行处理


猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/84502943