单链表的算法题

单链表很简单,就是一些细节要注意。

多练练现场纸上手写。

#include <iostream>
using namespace std;

struct node {
    int key;
	node * next;

	node () :
	key(-1), next(NULL) 
	{}

	node (int n) :
	key(n), next(NULL) 
	{}
};

void print (node * head) {
	while (head) {
		cout << head->key << " ";
		head = head->next;
	}
	cout << endl;
}

node * reverse (node * head) {
    if (head == NULL ||
			head-> next == NULL) {
	    return head;
	}

	node * pre = NULL;
	node * cur = head;
	node * next = NULL;

	while (cur) {
		next = cur->next;
		cur->next = pre;
		pre = cur;
		cur = next;
	}

	return pre;
}

node * reverse (node * head, int k) {
    if (head == NULL ||
			head-> next == NULL) {
	    return head;
	}

	node * pre = NULL;
	node * cur = head;
	node * next = NULL;
	int i = 0;
	while (cur && i<k) {
		next = cur->next;
		cur->next = pre;
		pre = cur;
		cur = next;
		i++;
	}

	if (cur == NULL) {
		return pre;
	}

	node * new_head = pre;
	pre = NULL;
	while (cur) {
		next = cur->next;
		cur->next = pre;
		pre = cur;
		cur = next;
	}

	head->next = pre;
	return new_head;
}

node* pair_swap (node * head) {
    if (head == NULL ||
			head-> next == NULL) {
	    return head;
	}

	node tmp_head;
	node* pre = &tmp_head;

	node* first = head;
	while (first && first->next) {
		node* second = first->next;
		first->next = second->next;
		second->next = first;

		pre->next = second;
		pre = first;
		first = first->next;
	}

	return tmp_head.next;
}

int main () {
	int key;
	node * head = NULL;
	while (cin >> key) {
		node * cur = new node(key);
		cur->next = head;
		head = cur;
	}
	print (head);
	head = reverse(head);
	print (head);
	head = reverse(head, 3);
	print (head);
	head = pair_swap(head);
	print (head);
}

sample input:

8 7 6 5 4 3 2 1

sample output:

1 2 3 4 5 6 7 8    //原始链表

8 7 6 5 4 3 2 1    //翻转链表

6 7 8 1 2 3 4 5    //前k个翻转,后面的再翻转

7 6 1 8 3 2 5 4    //两两交互相邻元素

时间: 2024-08-13 05:22:19

单链表的算法题的相关文章

单链表的算法设计

当学习完单链表后,仔细回忆回忆,单链表还是很容易掌握的,但是还是要仔细认真的品味. 单链表可以看做是由若干个结点由指针指向后继结点一种表.结点是由数据域和指针域构成.真正有效的存储是数据域,指针域负责指向下一个结点存储的位置,所以它的存储密度都是小于1,而之前学习的顺序表存储密度都是1.那么如何定义结构体 12345 typedef struct { Eletype data; struct *next;//指针域}node,*Node; 那么单链表具体可以做些什么操作哪? 初始化操作,主要是对

链表相关算法题总结 1

链表题目对算法的要求度不高,但实际写的过程中需要注意语言细节,考虑精细度的地方很多. 1.链表结构与基本操作 1.1 添加节点 一般情况: cur ->next = prev ->next; prev ->next = cur; 表头插入: cur ->next = head; head = cur; 1.2删除节点 一般情况:(已知待删除节点的前驱节点) ListNode* temp = prev->next; prev->next = prev->next-&

单链表倒置算法

LinkList reverse(LinkList L)//单链表的倒置算法 { LNode *p,*q; p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; }

单链表的算法

要点 单链表的结构可表示如下: typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; } LNode, *LinkList; 基本算法 插入结点 假设要在单链表的a结点和b结点之间插入一个值为x的新结点. 如下图所示,指针s指向一个值为x的结点,为了插入s. 首先让s的next指针指向b,即s->next = p->next; 然后,让a的next指针指向s,即p->next = s

数据结构线性单链表的算法实现和时间复杂度分析

#include<stdio.h>#include<stdlib.h>//线性表的动态分配链式存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量#define LISTINCREMENT 10//线性表存储空间的分配增量//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

第4章第1节练习题6 二叉树叶子节点链接成单链表

问题描述 设计一个算法,将二叉树的叶子节点按从左到右的顺序连成一个单链表,表头指针为head.链接时用叶子节点的右指针来存放单链表指针. 算法思想 题目要求将叶子节点按自左向右的次序连接成一个单链表,因此很容易考虑到的便是将整棵二叉树按照先序或中序或后序的方式遍历一次. 在遍历的过程中对叶子节点单独判断,如果是叶子节点,则将其做一个标识(比如用额外的指针指向该节点),接着遍历下一个叶子节点,遍历到另一个叶子节点后,然后让已被标识的叶子节点的右孩子指向该节点,依次类推便可以实现将叶子节点连接成单链