如何实现链表的逆序

1 单向链表的反转

问题描述:

  给定一个带头结点的单链表,请将其逆序。即如果单链表原来为head -->1 --> 2 --> 3 --> 4 --> 5,那么逆序后变为head --> 5 --> 4 --> 3 --> 2 --> 1。

解决过程:

  给定一个单向链表1-->2-->3,通过下面的示意图,看如何一步一步的将单向列表反转。

代码实现:

 1 class Node(object):
 2     def __init__(self, data):
 3         self.data = data
 4         self.next = None
 5
 6 def createSingleLink():
 7     head = Node(1)
 8     cur = head
 9     for i in range(2, 10):
10         cur.next = Node(i)
11         cur = cur.next
12     return head
13
14 def printSingleLink(head):
15     cur = head
16     while cur is not None:
17         print(cur.data, end=‘‘)
18         if cur.next is not None:
19             print("-->", end=‘‘)
20         cur = cur.next
21
22 def Reverse(head):
23     pre = None
24     cur = head
25     while cur is not None:
26         next_ = cur.next
27         cur.next = pre
28         pre = cur
29         cur = next_
30     return pre
31
32 if __name__ == ‘__main__‘:
33     singleHead = createSingleLink()
34     printSingleLink(singleHead)
35     reverSingleHead = Reverse(singleHead)
36     print()
37     printSingleLink(reverSingleHead)

2 双向链表反转

问题描述:

  给定一个带头结点的双向链表,请将其逆序。即如果单链表原来为head -->1 --> 2 --> 3 --> 4 --> 5,那么逆序后变为head --> 5 --> 4 --> 3 --> 2 --> 1。

解决过程:

  例如,给定一个带头结点的双向链表1-->2-->3,如下图看如何一步一步进行反转:

代码实现:

 1 class Node(object):
 2     def __init__(self, data):
 3         self.last = None
 4         self.data = data
 5         self.next = None
 6
 7 def creatDoubleLink():
 8     head = Node(1)
 9     cur = head
10     for i in range(2, 10):
11         cur.next = Node(i)
12         Node(i).last = cur
13         cur = cur.next
14     return head
15
16 def printDoubleLink(head):
17     cur = head
18     while cur:
19         print(cur.data, end=‘‘)
20         if cur.next:
21             print("-->", end=‘‘)
22         cur = cur.next
23
24 def Reverse(head):
25     pre = None
26     cur = head
27     next_ = None
28     while cur:
29         next_ = cur.next
30         cur.next = pre
31         cur.last = next_
32         pre = cur
33         cur = next_
34     return pre
35
36 if __name__ == ‘__main__‘:
37     doubleHead = creatDoubleLink()
38     printDoubleLink(doubleHead)
39     reveDoubleHead = Reverse(doubleHead)
40     print()
41     printDoubleLink(reveDoubleHead)

3 总结:

  单向链表和双向链表的反转比较简单,只需做到代码一次成型,运行不出错即可。上述两种代码的实现过程,都是对原有的链表进行遍历,所以如果链表长度为N,那么它们的时间复杂度和空间复杂度为O(N)和O(1)。

原文地址:https://www.cnblogs.com/dabric/p/11694446.html

时间: 2024-08-01 22:43:24

如何实现链表的逆序的相关文章

JAVA链表实现与链表的逆序

1.链表         链表有单链表还有双向链表,在java中每个节点都是一个类,这里声明了内部类,为了方便插入和删除,有时会在,链表的表头加上哨兵(形成有哨兵的循环或双向循环链表),这样的插入删除就不用考虑当插入删除的元素在边界的情况,方便,至于哨兵你可能觉得没什么用,其实他可以存储链表的许多信息,比如你每次查找一个元素,在无哨兵时,使用P!=null,使用哨兵,可以存储要查找的元素,退出时,就要判断是不是哨兵. 2.链表的实现与逆序 若想代码写得快,必须清楚每次交换插入,产生的状态和性质.

C语言实现链表的逆序打印

我在前面几篇博客中<C语言实现链表节点的插入><C语言实现链表节点的删除><C实现头插法和尾插法来构建链表><C语言实现链表的基本操作>实现了链表的很多增删改查操作.这里我们要来实现链表的逆序打印,使用C来实现.代码上传至 https://github.com/chenyufeng1991/ReverseLinkedList . 基本算法是: (1)使用尾插法构建原链表: (2)依次遍历原链表: (3)取出遍历中的节点使用头插法建立一个新链表: (4)打印逆

java 实现单链表的逆序

</pre><pre name="code" class="java">package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedReverse { class Node{ int data; Node next; public Node(int data){ this.data = data; } }

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

[算法]链表的逆序遍历节点

有一个链表,知道链表头,怎么逆序打印出链表每个节点的值. 我们知道,当知道了链表头的时候,很容易顺序访问所有节点的值,但是如何逆序访问所有节点呢? 访问一棵二叉树,通常可以深度优先和广度优先访问每个节点,深度优先又分为先序,中序和后续遍历,后续遍历就是先访问树的右子树,再访问左子树,最后访问父节点,如果我们把一个链表看成是一颗单叉树,利用树的后续遍历就达到了逆序访问链表的每个节点,利用递归,实现代码如下: struct node { int val; node* next; }; void tr

C++单链表递归逆序

#include <iostream> using namespace std; struct Node { int data; Node *next; Node(int d = int()) :data(d), next(NULL){} }; class List { public: List() { first = NULL; } void Insert(int a[], int n) { Node *p = first; for (int i = 0; i < n; i++) {

单链表的逆序 (采用头插法实现)

// 单链表的建立// 单链表的建立可以用头插法或者尾插法.头插法是指建立单链表时, 总是将新节点插入到当前链表的表头.// 头插法常用在将一个已存在的链表逆序. 1 #include <iostream> 2 3 using std::cout; 4 using std::endl; 5 6 struct Item{ 7 char c; 8 Item *next; 9 }; 10 Item *Routine1(Item *x){ 11 Item *prev = NULL, *curr = x

【链表】实现单链表的逆序

1 public class Main { 2 3 // 就地逆序法 4 public Node reverse(Node head) { 5 // no need to reverse 6 if (head == null || head.next == null || head.next.next == null) { 7 return head; 8 } 9 10 // pointer 11 Node pre = head; 12 Node cur = head.next; 13 Node

单向链表的逆序操作

废话不多说,直接看代码 #include <stdio.h> #include <stdlib.h> #define ElemType int typedef struct node{ ElemType data; struct node *next; }node,*link; void display(link list); //使用头插法 link createH(link l){ ElemType i; l->next=NULL; link p=NULL; while(