链表的翻转与排序

面试中常常会考到链表的翻转和排序,在此手动实现了一发,希望能对大家产生帮助

#include <iostream>
using namespace std;

template<class T>
struct Node
{
    Node<T>* pNext;
    T val;
};

template<typename T>
void append(Node<T>* head,T val)//添加节点
{
    while(head->pNext!=NULL)
    {
        head=head->pNext;
    }
    Node<T> *pNode = (struct Node<T>*)malloc(sizeof(struct Node<T>*));
    pNode->val=val;
    pNode->pNext=NULL;
    head->pNext=pNode;
}

template<typename T>
void show(Node<T>* head)//显示链表
{
    while(head->pNext!=NULL)
    {
        head=head->pNext;
        cout<<head->val<<" ";
    }
}

template<typename T>
Node<T>* reverseRec(Node<T>* Head,Node<T>* CNode,Node<T>* Prev)//链表翻转递归法
{
    if(CNode->pNext!=NULL)
    {
        Node<T>* pNode=reverseRec(Head,CNode->pNext,CNode);
        if(Prev==Head)
            CNode->pNext=NULL;
        else
            CNode->pNext=Prev;
        return pNode;
    }
    else
    {
        CNode->pNext=Prev;
        return CNode;
    }
}

template<typename T>
void reverseOde(Node<T>* pHead)//链表翻转非递归法
{
    if(pHead==NULL||pHead->pNext==NULL)
        return;
    Node<T>* pTem=pHead->pNext;
    Node<T>* pTemPre =pHead;
    Node<T>* pTemNe;
    while(pTem->pNext!=NULL)
    {
        pTemNe=pTem->pNext;
        if(pTemPre==pHead)
            pTem->pNext=NULL;
        else
            pTem->pNext=pTemPre;
        if(pTemNe->pNext==NULL)
            break;
        pTemPre=pTem;
        pTem=pTemNe;
    }
    pTemNe->pNext=pTem;
    pHead->pNext=pTemNe;
}

template<typename T>
inline void exchange(Node<T>* pNode1Pre,Node<T>* pNode1,Node<T>* pNode2)//节点交换
{
    pNode1Pre->pNext=pNode2;
    pNode1->pNext=pNode2->pNext;
    pNode2->pNext=pNode1;
}

template<typename T>
void ListBoubleSort(Node<T>* pHead)//冒泡排序
{
    Node<T>* pNode1;
    Node<T>* pNode2;
    Node<T>* pNode2Pre;
    pNode1=pHead->pNext;
    while(pNode1->pNext!=NULL)
    {
        pNode1=pNode1->pNext;
        pNode2=pHead->pNext;
        pNode2Pre=pHead;
        while(pNode2->pNext!=NULL)
        {
            if(pNode2->val>pNode2->pNext->val)
            {
                exchange(pNode2Pre,pNode2,pNode2->pNext);
                pNode2=pNode2Pre->pNext;  //指针要指回之前的位置
            }
            pNode2Pre=pNode2Pre->pNext;
            pNode2=pNode2->pNext;
        }
    }
}

int main()
{
    Node<int> *pHead = (struct Node<int>*)malloc(sizeof(struct Node<int>*));
    pHead->pNext=NULL;
    for(int i=15;i>0;i--)
        append(pHead,i);

    show(pHead);
    cout<<endl;

    pHead->pNext=reverseRec(pHead,pHead->pNext,pHead);//递归翻转,返回尾节点
    show(pHead);
    cout<<endl;

    reverseOde(pHead);//非递归翻转
    show(pHead);
    cout<<endl;

    ListBoubleSort(pHead);//冒泡排序
    show(pHead);
    cout<<endl;

    return 0;
}
时间: 2024-11-03 21:08:04

链表的翻转与排序的相关文章

c语言之单链表的创建及排序

今天对之前学习过的链表知识进行简单的总结顺便写点代码:创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数 下面代码贴出具体代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct person { 5 int age; 6 struct person *next; 7 }; 8 9 struct person *insert_head(struct

链表的应用——箱子排序和基数排序

单向链表的实现 数据结构它描述的是数据和数据之间的关系.数据结构要三大要素:逻辑结构,描述数据和数据之间的关系,分为线性结构和非线性结构两种,所谓线性结构指的就是这种数据结构描述的数据之间存在这样的关系,除了首元素和微元素,任何元素都存在一个唯一前驱和唯一后继(前驱通俗的说就是这个元素的前一个元素,后继就是这个元素的后一个元素),而非线性结构中的数据元素之间就不存在这种关系,而是用父节点子节点的关系来描述,也就是说前驱后继不存在唯一性:存储结构,所谓存储结构,实际上指的就是怎么它数据之间的逻辑结

链表的翻转(java)

翻转的两种方法:非递归与递归. 1.非递归方法 public ListNode reverse(ListNode node) { Node prev = null; while (node != null) { //每次新建一个链表,用来读取每次循环操作的一个节点 ListNode tmp = node; //将传入的链表指向下一个节点,下次循环将下一个节点重新赋给tmp node = node.next; //将取出的节点的下一个节点置为上次操作后已完成翻转的部分节点 tmp.next = p

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

关于链表的功能(排序,添加,删除,判断长度,判断是否为空,遍历)

#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct node { int data//数据域 struct node * pnext;//指针域 }node,*pnode;(分号不能少)//node等价于 struct node pnode等价于struct node * pnode create_list(void); void traverse_list(pnode ph

【java】实现Interface Comparable&lt;T&gt;接口的int compareTo(T o)方法实现对象数组或链表或集合的排序

1 package 对象比较排序; 2 3 import java.util.Arrays; 4 5 class A implements Comparable<A>{ 6 private String name; 7 private int age; 8 public A(String name,int age){ 9 this.name=name; 10 this.age=age; 11 } 12 @Override 13 public int compareTo(A o) {//此方法无

链表的创建 查找 排序 插入 删除 逆序 长度 显示

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> typedef int elementType; typedef struct node {     int data;     struct node1*next; } LinkList; FILE *fp; LinkList*Creat(int length) {     LinkList*hea

数组的翻转和排序

<script> //数组排序:sort(功能很强大!能对数字和字母进行排列. // 回调函数. console.log(arr2.sort(function (a,b) { // a-b升序 // b-a降序 return a-b; })); var arr2 = [7,6,15,4,13,2,1]; console.log(arr2.sort(function(){ return a-b; })); </script> 原文地址:https://www.cnblogs.com/

链表的部分翻转

链表相加: 给定一个链表,翻转该链表从m到n的位置.要求直接翻转而非申请新空间. 如:给定:1->2->3->4->5,m=2,n = 4. 返回:1->4->3->2->5. 程序实现: 1 /************************************ 2 File Name:ListPartReverse.cpp 3 Author: godfrey 4 Created Time: 2016/04/28 5 *****************