实现单链表的就地逆置算法

题目:有一个线性表(a1,a2,a3,....,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置。所谓“就地”指辅助空间应该为O(1)。

方法一:采用头插法

先将L的头节点head的Next域置为NULL变成一个空链表,然后用p结点采用头插法插入到L中。

[java] view plaincopy

static Node headInsert(Node head){     if(head == null || head.next == null){       System.out.println("逆置的单链表至少有2个结点");       return null;     }     else{       Node p = head.next;       head.next = null;       Node q = null;       while(p != null){         q = p;         p = p.next;         q.next = head;         head = q;       }       return q;     }   }

方法二:

先将首节点的next置为NULL,用p,q指向单链表中相邻的两节点,将r指向q的下一个结点,然后同步后移。当q=NULL时,表示指向原单链表的尾结点,将L的next域指向p即可。

[java] view plaincopy

static Node invert(Node head){     Node p,q,r;     if(head == null || head.next == null){       System.out.println("逆置的单链表至少有2个结点");       return null;     }     else{       p = head;       q = p.next;       while(q != null){         r = q.next;         q.next = p;         p = q;         q = r;       }       head.next = null;       head = p;       return head;     }   }

[java] view plaincopy

题目:有一个线性表(a1,a2,a3,....,an),采用带头节点的单链表L存储,设计一个算法将其就地逆置。所谓“就地”指辅助空间应该为O(1)。

方法一:采用头插法

先将L的头节点head的Next域置为NULL变成一个空链表,然后用p结点采用头插法插入到L中。

[java] view plaincopy

static Node headInsert(Node head){     if(head == null || head.next == null){       System.out.println("逆置的单链表至少有2个结点");       return null;     }     else{       Node p = head.next;       head.next = null;       Node q = null;       while(p != null){         q = p;         p = p.next;         q.next = head;         head = q;       }       return q;     }   }

方法二:

先将首节点的next置为NULL,用p,q指向单链表中相邻的两节点,将r指向q的下一个结点,然后同步后移。当q=NULL时,表示指向原单链表的尾结点,将L的next域指向p即可。

[java] view plaincopy

static Node invert(Node head){     Node p,q,r;     if(head == null || head.next == null){       System.out.println("逆置的单链表至少有2个结点");       return null;     }     else{       p = head;       q = p.next;       while(q != null){         r = q.next;         q.next = p;         p = q;         q = r;       }       head.next = null;       head = p;       return head;     }   }

[java] view plaincopy


相关文章

  • 数据结构第2章-答案
  • 一.填空题 01.当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用顺序存储结构. 02.线性表L=(a1,a2, -,an )用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均 ...查看


  • 数据结构耿国华
  • 第一章 三.计算下列程序段中X=X+1的语句频度 for(i=1;i for(j=1;j for(k=1;k x=x+1; [提示]: 2 i=1时: 1 = (1+1)×1/2 = (1+1)/2 i=2时: 1+2 = (1+2)×2/ ...查看


  • 数据结构经典算法试题
  • 1. 假设有两个按元素值递增次序排列的线性表,均以单链表形式.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表.[北京大学 1998 三.1 (5分)] LinkedList ...查看


  • 数据结构A教学大纲
  • 数据结构A 教学大纲 (Data Structures A) 课程编号: 06311360 学 分: 5.0 学 时: 75 (其中:讲课学时:60 实验学时:0 上机学时:15) 先修课程:离散数学.程序设计基础.面向对象程序设计 适用专 ...查看


  • 2015澳门特别行政区数据简介深入
  • 1.冒泡排序算法是把大的元素向上移(气泡的上浮),也可以把小的元素向下移(气泡的下沉)请给出上浮和下沉过程交替的冒泡排序算法. 48.有n个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,请写出这种排序的算法.(注: ...查看


  • 2010~2011安徽大学数据结构期末试卷
  • 2010~2011安徽大学<数据结构>期末试卷 一.单选题 从供选择的答案中选出正确的答案,将其编号填入括号中. 1.在数据结构的讨论中把数据结构从逻辑上分为( ). A: 内部结构与外部结构 B: 静态结构与动态结构 C: 线 ...查看


  • 数据结构上机实验
  • 数据结构上机实验 姓名: 学号: 院系: 指导教师: 1 数据结构上机实验报告 实验一 线性表 一. 实验目的 1. 熟悉线性表的顺序和链式存储结构 2. 掌握线性表的基本运算 3. 能够利用线性表的基本运算完成线性表应用的运算 二.实验内 ...查看


  • 数据结构上机实验报告
  • 实验一:线性表的基本操作 [实验目的] 学习掌握线性表的顺序存储结构.链式存储结构的设计与操作.对顺序表建立.插入.删除的基本操作,对单链表建立.插入.删除的基本操作算法. [实验内容] 1. 顺序表的实践 1) 建立4个元素的顺序表s=s ...查看


  • 抽象数据类型的实现
  • 第3章 抽象数据类型的实现 3.1 实验概要 实验项目名称: 抽象数据类型的实现 实验项目性质: 设计性实验 所属课程名称: 数据结构 实验计划学时: 6 3.2 实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据 ...查看


热门内容