leetcode_1题——Swap Nodes in Pairs(线性表的链式存储)

Swap Nodes in Pairs

Total Accepted: 45110 Total Submissions: 138992My Submissions

Question Solution

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

Hide Tags

Linked List

Have you met this question in a real interview?

Yes

No

Discuss

这道题没啥好说的,主要是线性表的链式存储结构,需要注意的是,在题目的线性表中,head头结点是第一个结点。

#include<iostream>

using namespace std;

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

ListNode* swapPairs(ListNode* head) {
	ListNode* ptr=head;
	ListNode* ptr0;
	ListNode* ptr1;
	ListNode* ptr2;
	ListNode* temp;

	if(head==NULL)
		return ptr;
	if(ptr->next==NULL)
		return ptr;

	ptr0=ptr;
	ptr1=ptr0->next;

	ptr0->next=ptr1->next;
	ptr1->next=ptr0;
	temp=ptr0;
	ptr0=ptr1;
	ptr1=temp;
	ptr=ptr0;

	ptr2=ptr1->next;
	if(ptr2==NULL)
		return ptr;

	ptr2=ptr2->next;
	if(ptr2==NULL)
		return ptr;
	ptr1=ptr1->next;
	ptr0=ptr0->next;

	while(1)
	{

		ptr1->next=ptr2->next;
		ptr2->next=ptr1;
		ptr0->next=ptr2;
		temp=ptr1;
		ptr1=ptr2;
		ptr2=temp;

		if(ptr2->next==NULL)
			return ptr;
		ptr2=ptr2->next;
		ptr1=ptr1->next;
		ptr0=ptr0->next;

		if(ptr2->next==NULL)
			return ptr;
		ptr2=ptr2->next;
		ptr1=ptr1->next;
		ptr0=ptr0->next;
	}

	return ptr;
}

  若是题目中的线性表的存储的头结点没有存储数据的话,又是另外一种做法了

ListNode* swapPairs(ListNode* head)
{
	ListNode* ptr;
	ListNode* ptr0;
	ListNode* ptr1;
	ListNode* ptr2;
	ListNode* temp;

	ptr=ptr0=head;
	if(ptr==NULL)
		return ptr;
	if(ptr->next==NULL)
		return ptr;
	ptr1=ptr0->next;
	if(ptr1->next==NULL)
		return ptr;
	ptr2=ptr1->next;

	while(1)
	{
		ptr1->next=ptr2->next;
		ptr2->next=ptr1;
		ptr0->next=ptr2;
		temp=ptr1;
		ptr1=ptr2;
		ptr2=temp;

		if(ptr2->next==NULL)
			return ptr;
		ptr2=ptr2->next;
		ptr1=ptr1->next;
		ptr0=ptr0->next;

		if(ptr2->next==NULL)
			return ptr;
		ptr2=ptr2->next;
		ptr1=ptr1->next;
		ptr0=ptr0->next;
	}
	return ptr;
}
int main()
{
	ListNode* head;
	head=(ListNode*)malloc(sizeof(ListNode));
	head->val=1;

	ListNode* ptr2;
	ptr2=(ListNode*)malloc(sizeof(ListNode));
	head->next=ptr2;
	ptr2->next=NULL;
	ptr2->val=2;

	cout<<head->val<<‘ ‘<<head->next->val<<endl;

	ListNode* head1;
	head1=swapPairs(head);
	cout<<head1->val<<‘ ‘<<head1->next->val<<endl;

}

  

  

时间: 2024-12-07 08:30:42

leetcode_1题——Swap Nodes in Pairs(线性表的链式存储)的相关文章

线性表的链式存储结构

1 n个结点链结成一个链表,即为线性表的链式存储结构,由于每一个结点只包含一个指针域,因此称为单链表. 链表中第一个结点的存储位置成为头指针,那么整个链表的存取就必须是从头指针开始了. 有时候会在单链表的第一个结点前附设一个结点,称为头结点. 头指针与头结点的区别: 头指针: (1)头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. (2)头指针具有标识作用,所以常用头指针冠以链表的名字. (3)无论链表是否为空,头指针都不为空.头指针是链表的必要元素. 头结点: (1)

线性表的链式存储之单链表的尾插法

对单链表进行遍历.查找.插入.删除等操作,最终效果如下: 相关C代码如下: /*线性表的链式存储之单链表的尾插法*/ #include <stdio.h> #include <stdlib.h> #include <malloc.h> /*定义变量*/ typedef int DataType; typedef struct node{     //定义链表结点数据结构 DataType data; struct node * pNext; }NODE; typedef

线性表的链式存储

线性表的链式存储 线性表的链式存储 基本概念 设计与实现 实现代码 优缺点 1. 基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息 尾结点 链表中的最后一个数据结点,其下一元素指针为空,表示无后继. 2.设计与实现 在C语言中可以用结构体来定义链

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一

数据结构第三篇——线性表的链式存储之单链表

线性表的链式存储结构的特点是用一组任意的存储单元来存储线性表的数据元素,这些单元可以分散在内存中的任意位置上,其在物理上可以是连续的,也可以是不连续的.具有链式存储结构的线性表称为线性链表. 为了表示出每个数据元素与其后继之间的关系,除了存储数据元素本身的信息之外,还需存储指示其直接后继的信息.这可以用一个结点(node)来完整的表示. 将节点中存储数据元素本身信息的域称为数据域:存储其直接后继位置的域称为指针域.指针域中存储的信息称作指针或链. 一般情况下,链表中每个结点可以包含若干个数据域和

【数据结构】-线性表的链式存储结构

引言:由于线性表的顺序存储结构在插入和删除时需要大量移动数据元素,从而引入线性表的链式存储结构. 线性表的链式存储结构:用一组任意的存储单元(可以连续也可以不连续)存储线性表的数据元素. 为了表示数据元素ai和其直接后继ai+1之间的逻辑关系,对ai来说,除了存储其本身的数据信息外,还需要存储其直接后继的存储位置.这两部分信息组成数据元素ai的存储映像(结点).它包含两个域:其中存储数据元素信息的域称为数据域:存储直接后继存储位置的域称为指针域. n个结点链接成一个链表,称为线性链表,由于此链表

线性表 顺序存储 链式存储 ---java实现

首先抽象出一个线性表抽象类(包含基本的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E t); public abstract void add(int index,E t); public abstract void remove(); public abstract void remove(int index); public abstract int getCount(); public

数据结构开发(5):线性表的链式存储结构

0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? 链式存储的定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息. 链式存储逻辑结构: 基于链式存储结构的线性表中,每个结点都包含数据域和指针域 数据域:存储数据元素本身 指针域:存储相邻结点的地址 专业术语的统一: 顺序表 基于顺序存储

数据结构--线性表的链式存储结构

一 线性表的链式存储结构 A.链式存储的定义为了表示每个数据元素与直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息图示B链式存储逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域1.数据域:存储数据元素本身2.指针域:存储相邻结点的地址图示C链表中的基本概念1.头结点--链表中的辅助结点,包含指向第一个数据元素的指针(方便插入和删除)2.数据结点--链表中代表数据元素的结点,表现形式为:(数据元素,地址)3.尾节点--链表中的最后一个数据结点,包