リンクリストの高度な操作1:隣接するノードの位置を交換し、ノードのすべての奇数と偶数の位置を交換します(グラフィックデモンストレーション、理解しやすい)

リンクリストで実行できる操作はたくさんあります。次に、リンクリストでの高度な操作について説明します。

まず、隣接ノードがどのように交換されるかについて説明しましょう

1つは、最初にリンクリストを作成する

コードに直接移動します(リンクリストの作成方法がわからない学生は、私の最後の記事を読むことができます)

//需要的两个头文件
#include<stdio.h>
#include<stdlib.h>

//定义结构体(包含指针域和数据域)
typedef struct Node
{
    
    
	int data;
	struct Node *next;
 } Node;
 
 
 int main()
 {
    
    
 	Node *p1,*p2;      //定义两个指针进行各种操作(可看我的上一篇文章)
 	Node *head;       //定义head指针标记头结点

	int x; 	
 	head = NULL;
 	
 	
 	printf("请输入创建多少个链表:"); 
 	scanf("%d",&x);
 	
// 	创建链表节点并连接 
	for(int i=1;i<=x;i++)
 	{
    
    
 		p1 = (Node *)malloc(sizeof (Node));
 		if(head == NULL)
			{
    
    
		 		head = p1;
		 		p2 = p1;
			}
		else
		{
    
    
			p2->next =p1;
			p2 = p1;
		}
	}
	
	p2->next = NULL;    //把尾结点标记为NULL
	p = head;

現時点では、リンクリスト図は次のとおりです。

ここに画像の説明を挿入

リンクリストの順序はすでに修正されています。交換2ノードと3ノードなど、リンクリスト内の隣接ノードの位置を交換する場合はどうすればよいですか?2つのポインタでそれを達成する方法は?

2.最初に、2番目と3番目のノードの位置を変更してみます

交換後の位置は1→3→2→4→...つまり、ノード1を3の位置に、ノード2を4の位置に向けてから、2,3ノードを反転する必要があります。 2,3ノード交換を実現します。

操作を図に示します。
ここに画像の説明を挿入

この絵はあまり直感的ではないようです。わからなくても自分で考える必要があります実際、1→2→3→4は1→3→2→4になります

コードに直接:

为方便理解,我们先定义三个指针*p,*p1,*p2分别指向1,23的位置
即:p = head;
	p1 = p->next;
	p2 = p1->next;
调换位置的操作:
	p->next = p2;                1指向3的位置
	p1->next = p2->next;         2指向4的位置
	p2->next = p1;               3又指向2的位置
	

3.データの入出力、操作が正しいか確認してください

输入数据
	int q=1;
	while (p != NULL)
	{
    
    
		p->data = q;
		q++;
		printf("%d ",p->data);
		p = p->next;
	 } 
	
	printf("\n");
输出数据:
	p = head;
	
	while (p != NULL)
	{
    
    
		printf("%d ",p->data);
		p = p->next;
	 } 

演算結果:


请输入创建多少个链表:4
1 2 3 4
1 3 2 4
--------------------------------
Process exited after 4.014 seconds with return value 0
请按任意键继续. . .

位置2、3を切り替える操作は成功しました

リンクリスト内のすべてのノードの奇数と偶数の位置を交換するにはどうすればよいですか?

これはルームメイトへの質問です。おそらく1と2のポジション交換と3と4のポジション交換を実現することでしょう。私は30分勉強しました。あなたと私の考えを共有するためにそれを送りたいと思います。 。

私の考えについて話す

実際、先ほどお話ししたのは、隣接するポジションを交換する高度な操作です。ループをもう1つ追加するだけです。3つのポインターを定義する利点は、pポインターを使用して位置をマークし、p1とp2を使用して位置を交換する機能を実現することです。

上記からわかるように、2つのノードの位置を交換するには、少なくとも、交換されたノードの前の1つの位置を知る必要があります。つまり、ノード2、3の位置を変更する場合は、ノード1の位置を知っている必要があります。そうしないと、ノード1がノード3の位置を指すことができず、操作が失敗します。

注:ノード1、2の位置が交換されている限り、前のノードの位置をマークする必要がないため、特殊化する必要があります(最初にこれら2つの位置を置き換えます)

1.最初にノード1、2の位置を変更します

代码如下: 
	p1=head;                 p1指向1 节点的位置 
 	p2=head->next;           p2指向2 节点的位置
 	
 			
	head=p2;                 因为2节点要变成头结点,所以p2标记为head
 	p1->next = p2->next;     1指向3
 	p2->next = p1;           2指向1

	已经完成了1,2节点位置的调换

次に、設計サイクル後のノードの位置が交換されます

pノードは偶数ノードの位置をマークする必要があることがわかりました。つまり、3と4を交換すると2つのノードがマークされ、5と6を交換すると4つのノードがマークされます。

奇数から偶数まで常にp1だからです。したがって、交換が完了した後、pを使用してp1の位置をマークします。

コードに直接:

调换:

p = p1;                              标记上一次调换完成后p1的位置


for(a=1;a<=(x/2)-1;a++)              for循环语句,由于已经调换了1,2,所以循环次数-1
{
    
    
	p1 = p->next;                    
	p2 = p1->next;                   p→p1→p2           
	
	p->next = p2;                   
	p1->next = p2->next;             进行调换奇数偶数节点的调换
	p2->next = p1;
	
	p=p1;                            标记调换完成后p1的位置
}

3.リンクリストのデータを出力し、動作が正しいか確認してください。

代码如下:

	p = head;
	
	
	while(p != NULL)
	{
    
    
		printf("%d ",p->data);
		p = p->next;
	}
	

演算結果:


请输入创建多少个链表:9
反转前:1 2 3 4 5 6 7 8 9
反转后:2 1 4 3 6 5 8 7 9
--------------------------------
Process exited after 2.78 seconds with return value 0
请按任意键继续. . .

高度な操作は今後随時更新されますので、どなたでも気に入ってコレクションをフォローして
いただけれ幸いですご不明な点がございましたら、一緒にご相談ください。よろしくお願いします。

おすすめ

転載: blog.csdn.net/qq_54547310/article/details/115279482