链表 - 单链表逆序

单链表逆序是经典的链表操作算法,单链表逆序的算法思想是将链表箭头反指(假设next指针是一个箭头),即所谓的改链,改链过程如下。

逆序前:
head-->......prev-->cur-->next-->......->NULL
逆序后:
NULL<--......prev<--cur<--next<--......head

算法逻辑:

1.空链表或只有一个元素,返回原链表head。

2.定义3个指针prev、cur、next,初始化时,prev指向head,cur指向prev的next, next指向cur的next,当cur非空整体移动prev、cur、next, 同时进行改链操作。

3.将head的next指向NULL,返回逆序后的链表头cur。

实现算法见reverse_link.c。

/*file:reverse_link.c*/

typedef struct node {
    int value;
    struct node *next;
}node_t;

node_t *reverse_link(node_t *head)
{
    node_t *prev, *cur, *next;
    if (NULL == head || NULL == head->next)
        return head;

    prev = head;
    cur = prev->next;

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

    head->next = NULL;
    return prev;
}
时间: 2024-10-07 06:32:55

链表 - 单链表逆序的相关文章

算法--链表的K逆序问题

转载请标明出处http://www.cnblogs.com/haozhengfei/p/9e6f4dda3138cf9fab17f996ec85b624.html 链表的K逆序问题 链表的k逆序 第7节 链表的k逆序练习题 有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如链表1->2->3->4->5->6->7->8->null,K=3这个例子.调整后为,3->2->1->6-&g

数据结构实验之链表二:逆序建立链表

数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据. Input 第一行输入整数N;:第二行依次输入N个整数,逆序建立单链表. Output 依次输出单链表所存放的数据. Sample Input 10 11 3 5 27 9 12 43 16 84 22 Sample Output 22

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

算法题:链表的递归逆序

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

【数据结构】线性链表(单链表)

// // main.cpp // LinkList // // Created by T.P on 2019/1/31. // Copyright ? 2019 T.P. All rights reserved. // #include <stdio.h> #include <stdlib.h>//malloc free #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR -1 #define INFEASIBLE

链表 单链表反转

思路1:O(n^2). “狸猫换太子”,不进行改动链表结构,只首尾交换len/2次.但是在本函数中用到了定位函数,定位函数实际上是遍历了一遍整个链表,所以综合效率很低,达到O(n^2). //单链表反转(O(n^2)) void reverseList(Node* Head) { int count = numOfNodes(Head); //首尾交换 for(int i=1; i<=count/2; i++) { Node* p1 = locateNodeI(Head, i); Node* p

链表-单链表的各种操作

单链表的结构体的定义 typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 基本的单链表的操作 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点 if(!*L) exit(OVERFLOW); (*L)->next = NU

链表——单链表的排序

题目要求: 对单链表进行从小到大排序,要求时间复杂度O(N*logN),空间复杂度O(1): 思路: 因时间复杂度要求为O(N*logN),简单排序(时间复杂度为O(N*N))均不可用, 故可以考虑归并排序的思想,归并排序对数组操作空间复杂度为O(n),但对链表为O(1),因为每次只在merge函数中创建了一个辅助的链表头结点ListNode temp=new ListNode(0); 归并排序的一般步骤为: 1)将待排序数组(链表)取中点并一分为二: 2)递归地对左半部分进行归并排序: 3)递

链表—单链表

代码实现: 首先定义一个Node类: public class Node { protected Node next; //指针域 public int data;//数据域 public Node( int data) { this. data = data; } //显示此节点 public void display() { System. out.print( data + " "); } } 接下来定义一个单链表,并实现相关方法: public class LinkList {