Scheme 链表转置

原list: ( ( 1 2 ) ( 3 4 ) )

转置: ( ( 3 4 ) ( 1 2 ) )

深度转置: ( ( 4 3 ) ( 2 1 ) )

( define tree ( list 1 ( list 2 ( list 3 4 ) 5 ) ( list 6 7 ) ) )

( define nil ‘() )

( define ( my-reverse items )

( define ( rev-imp items result )

( if ( null? items )

result

( rev-imp ( cdr items )

( cons ( car items ) result ) ) ) )

( rev-imp items nil ) )

( my-reverse items )

> ( my-reverse tree )

((6 7) (2 (3 4) 5) 1)

( define ( deep-reverse items )

( define ( deep-rev-if-required item )

( if ( not ( pair? item ) )

item

( deep-reverse item ) ) )

( define ( deep-rev-imp items result )

( if ( null? items )

result

( deep-rev-imp ( cdr items )

( cons ( deep-rev-if-required( car items ) )

result ) ) ) )

( deep-rev-imp items nil ) )

> ( deep-reverse tree )

((7 6) (5 (4 3) 2) 1)

或:

( define ( deep-reverse items )

( if ( pair? items )

( my-reverse ( map deep-reverse items ) )

items ) )

> ( deep-reverse tree )

((7 6) (5 (4 3) 2) 1)

Scheme 链表转置

时间: 2024-10-15 06:35:24

Scheme 链表转置的相关文章

数据结构与算法分析 3.12 — 单链表转置

题目一:  不含头结点的单链表转置,算法时间复杂度O(N) 代码如下: struct LNode; typedef struct LNode *List; typedef struct LNode *Position; struct LNode { ElementType elem; Position next; }; /* 无头结点单链表转置 */ List Reversion(List L) { Position previousPos, currentPos, nextPos; previ

【算法设计-单链表的逆转】单链表逆转实现

1.在Θ(n)时间内将链表转置,而且只能需要少量的额外空间 这里需要用3个指针使得q指向p然后依次后移. 代码: #include<iostream> using namespace std; typedef struct Node { int data; struct Node *next; }LinkList; LinkList* Create_End(); void printLinkList(LinkList *L); LinkList* Create_End() { LinkList

一刷leetcode——链表

206. Reverse Linked List 题意:将链表转置 我的思路:递归实现,1A 我的代码: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverse(ListNode* head

用Java实现单链表的基本操作

笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode { private Node head; public ListNode(){ head=null; } //在链表前添加节点 public void addpre(int dvalue){ Node n=new Node(dvalue); if(head==null){ head=n; }els

stl_slist.h

stl_slist.h // Filename: stl_slist.h // Comment By: 凝霜 // E-mail: [email protected] // Blog: http://blog.csdn.net/mdl13412 /* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this

第44课 递归的思想与应用(中)

1. 单向链表的转置 [编程实验]单向链表的转置(Node* reverse(Node* list)) 2. 单向排序链表的合并 [编程实验]单向排序链表的合并(Node* merge(Node* list1, Node* list2)) 3. 汉诺塔问题 (1)游戏规则 ①将木块借助B柱由A柱移动C柱 ②每次只能移动一个土块 ③只能出现小土块在大木块之上 (2)递归求解的问题分解 ①将n-1个木块借助C柱由A移动到B柱. ②将最底层的唯一木块直接移动到C柱 ③将n-1个木块借助A柱由B柱移动到

【算法题】使用递归和非递归实现单向链表的转置

在阅读的过程中有任何问题,欢迎一起交流 邮箱:[email protected] QQ:1494713801 问题: 给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析: 假设每一个node的结构是: class Node { char value; Node next;} 非递归方式代码如下: 1. void reverse(struct Node **list) 2. { 3.    

与Scheme共舞

发表在<程序猿>2007年7月刊上.不log上写帖子不用考虑版面限制,所以这里的帖子比发表的啰嗦点.赵健平编辑,Jacky,和刘未鹏都给了我非常多帮助,在这里一并谢了.免费的Scheme实现非常多.我用的是PLT Scheme,能够到这里下载.PLT Scheme的IDE(Dr. Scheme)支持Emacs的键盘绑定,用emacs的老大们应该喜欢.Dr.Scheme内置中文支持: 以下是正文: 不能影响你思考方式的编程语言不值得学习 – Alan Perlis[1] 不少朋友问,为什么要学S

什么是链表

链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn