单链表的sort以及resver的实现(改变链表指向而非数值)

单链表的sort

排序采用冒泡法,不是单纯的改变链表结点的值,而是通过改变物理结构上的指针域指向实现。

    void sort(List *list)
{
    if(list->size <=1)`  //基本条件
        return ;
    Node *p,*q,*pa,*temp;

    for(int i=0;i<list->size-1;i++)//控制总次数
    {
        q=list->first->next; //初始换三个指针
        p=q->next;       //关系为pa>q>p
        pa=list->first;
        for(int l=0;l<list->size-1-i;l++)//控制每层循环次数
        {
            if(q->data>p->data)
            {
                if(list->last==p)    //需要修改链表的last指向
                    list->last=q;
                q->next=p->next;  //物理结构的改变
                p->next=q;
                pa->next=p;   现在的关系为pa>p>q

                temp=q;   //需要改为初始啥关系pa<q<p
                q=p;
                p=temp;
            }
            p=p->next;      //前进
            q=q->next;
            pa=pa->next;
        }
    }
}

单链表的resver

void resver(List *list)
{
    if(list->size<=1)
        return ;
    Node *q=list->first->next;
    Node *p=q->next;

    q->next=NULL;  //修改链表的last指向
    list->last=q;

    while(p!=NULL)
    {//指针关系为 q > p > list->first->next
        list->first->next=p->next;
        p->next=q;    //逆转
        q=p;       //重新赋值
        p=list->first->next;
    }
    list->first->next=q;  //添加头结点
}
时间: 2024-10-13 02:00:07

单链表的sort以及resver的实现(改变链表指向而非数值)的相关文章

009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道 后继结点,直接删除会使链表断开.不过我们可以删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =

cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针

实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针. 例子: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不需要返回什么,得到一个新链表:a->b->d->e 解答 这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了. 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供.在这种情况下, 你只能另觅他径.重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那

cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a->b->d->e 解答 这个问题的关键是你仅仅有一个指向要删除结点的指针,假设直接删除它,这条链表就断了. 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供.在这样的情况下, 你仅仅能另觅他径.又一次审视一下这个问题,我们仅仅能获得从c结点開始后的指针, 假设让你删除c结点后的

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

[程序员代码面试指南]链表问题-复制含有随机指针节点的链表(方法二待做)

问题描述 public class Node { public int val; public Node next; public Node rand; public Node(int data) { this.val=data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null. 给定一个由Node节点类型组成的无环单链表的头节点head,

LeetCode—Intersection of Two Linked Lists 找两个链表的相交位置,让长的链表先走一段

Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 begin to intersect at node c1. Notes: If the two linked lists have no i

27、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:同归并算法 本题: 1 public class Solution { 2 public ListNode Merge(ListNode list1, ListNode list2) { 3 ListNode head; 4 if (list1 == null) { 5 return list2; 6 } 7 if (list2 == null) { 8 return list1; 9 } 10

List.sort非数值类型排序

很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 sort有三种结果 1,-1,0分别是大,小,相等 升序降序比较 默认List的排序是升序排序 如果要降序排序,也很简单,只需要在前面加一个负号 List<int> tmp = new List<int>(){5,1,22,11,4}; tmp.Sort((x, y) => -x.CompareTo(y)); Console.WriteLine

009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)

呵呵,这个题不能直接删除已知的结点.由于是单链表,不知道前驱,仅仅知道 后继结点,直接删除会使链表断开.只是我们能够删除已知结点的后继结点, 把后继结点的值赋值给已知结点. #include <iostream> struct Node { int data; Node* next; }; bool removeNode(Node* vNode) { if (vNode == NULL || vNode->next == NULL) return false; Node* pNext =