反转链表

完全反转链表三种反转列表方式/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; *//*迭代法//O(n),O(1)*/class Solution{public: ListNode* reverseList(ListNod
摘要由CSDN通过智能技术生成

完全反转链表

三种反转列表方式

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

/*
迭代法
//O(n),O(1)
*/
class Solution
{
public:
    ListNode* reverseList(ListNode* head)
    {
        if(head == nullptr) return nullptr;
       
        ListNode *pre = nullptr, *cur = head,*next; //三个指针分别保存之前,当前,下一个结点
        while(cur)
        {
            next = cur->next; //保存原链表该结点的下一个结点,以免变换指向之后无法遍历到下一个结点
            cur->next = pre; //变换指向
           
            //更新指针
            pre = cur; //更新指针
            cur = next; //更新指针
        }
        return pre; //最后pre指向最后一个结点,cur指向null
    }
};
 
/*
递归法(不太好理解)
*/
class Solution
{
public:
    ListNode* reverseList(ListNode* head)
    {
        if(head == nullptr || head->next == nullptr) return head;
       	
       	//递归之后为从后往前开始转向
        ListNode* p = reverseList(head->next); 	//直接递归到最后一个列表元素开始从后往前翻转
        head->next->next = head;	//让当前结点的下一个结点的 next 指针指向当前节点
        head->next = nullptr;	//让当前结点的 nextnext 指针指向 NULLNULL ,从而实现从链表尾部开始的局部反转
        return p;
    }
};

/*
妖魔化指针
*/
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL) { return NULL; }
        ListNode* cur = head;
        while (head->next != NULL) {
            ListNode* t = head->next->next;	//迭代的下一个指针
            head->next->next = cur;		//当前节点的下一节点指向当前节点,从而改变了两个节点的前后顺序
            //更新节点
            cur = head->next;	//当前节点向后移动,是每次迭代的头结点
            head->next = t;	//是下一次迭代的头结点,翻转指向CUR
        }
        return cur;
    }
};

反转列表2

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/*
问题:翻转链表2(位置m~n翻转)
方法:对m~n位置处的链表进行翻转,然后连接m-1位置与n位置,m位置与n+1位置
例:
Input: 1 -> 2 -> 3 -> 4 -> 5 -> NULL, m = 2, n = 4
翻转得,1 <-> 2(m) <- 3 <- 4(n)   5 -> NULL
连接得,1 -> 4 -> 3 -> 2 -> 5 -> NULL
*/
class Solution
{
public:
    ListNode* reverseBetween(ListNode* head, int m, int n)
    {
        //异常情况处理(严格来说,还需判断m,n值是否超出链表长度,题目已经有此条件)
        if(!head || !head->next || m<0 || n<0 || m>=n) return head;
      
        //prehead的应用:头结点前的结点,方便索引,方便分析(链表用1开头+prehead分析较好,序号可以与步数对应起来)
        //且指向了链表的头结点,当m=1时,原头结点被换到后面,若返回head会出错,
        //而用prehead会指向新头结点,故返回prehead.next不会出错
        ListNode prehead(0);
        prehead.next = head;
       
        ListNode* cur = &prehead;
        for(int i = 1; i <= m-1; i++)
            cur = cur->next; //最后cur处在m-1位置
       
        ListNode* pre = cur;
        ListNode* next;
        cur = cur->next; //让cur处在m位置
        ListNode* prefirst = pre, *first = cur; //保存m-1位置和m位置处的结点
       
        for(int i = m; i<=n; i++) //翻转位置m~n处的链表
        {
            next = cur->next;
            cur->next = pre;
           
            pre = cur; //更新指针
            cur = next; //更新指针
        }//退出时,pre在n处,cur在n+1处
       
        prefirst->next = pre; //连接m-1与n位置
        first->next = cur; //连接m与n+1位置
       
        return prehead.next;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值