LeetCode-反转链表问题

1.反转链表

题目描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路: 反转链表也就是链表倒置,我一直以来的办法就是先建立一个头节点,之后再遍历链表来进行头插。
代码:

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null) {
            return null;
        }

        ListNode temp=new ListNode();
        ListNode cur=head;
        while(cur!=null) {
            ListNode curNext=cur.next;
            cur.next=temp.next;
            temp.next=cur;
            cur=curNext;
        }
        return temp.next;
}
}

2.反转链表 II

题目描述:

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表。

思路: 这一题一开始肯定会想到通过遍历得到左边节点的位置,以及左边节点前一个节点的位置,按照上一题头节点尾插的方法,以左边节点的前一个节点作为头节点来依次头插直至右边节点,然后对完成反转的部分和后面的链表进行拼接。但是这里有一个问题,如果left值给定的是1,那该找谁作用于头插的那个头节点。所以在进行这些操作之前,我首先定义一个空的头节点连接到原始链表之前,然后pre指针以头结点地址为初始值,cur指针以链表头为初始值进行遍历。具体可以看代码。

代码:

java 复制代码
class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(head==null) {
            return null;
        }
        
        //用空节点链接链表,防止出现left=1时无法进行头插逆置的问题
        ListNode temp=new ListNode();
        temp.next=head;

		//设定两个指针方便头插
        ListNode pre=temp;
        ListNode cur=head;

		//遍历获得右边节点的下一个节点的地址,用于头插结束的循环条件以及倒置操作完成后的拼接
        while(right!=0&&cur!=null) {
            cur=cur.next;
            right--;
        }
        ListNode end=cur;

		//遍历得到左边节点的地址
        cur=head;
        while(left!=1) {
            pre=cur;
            cur=cur.next;
            left--;
        }

		//记录倒置完成后倒置部分最后一个节点的地址
        ListNode tail=cur;
        //尾插倒置
        while(cur!=end) {
            ListNode curNext=cur.next;
            cur.next=pre.next;
            pre.next=cur;
            cur=curNext;
        }
		
		//拼接
        tail.next=end; 

		//返回定义空节点的下一个节点即可
        return temp.next;


    }


    
}
相关推荐
SsummerC1 分钟前
【leetcode100】杨辉三角
python·leetcode·动态规划
杰杰批2 分钟前
力扣热题100——普通数组(不普通)
算法·leetcode
CodeSheep2 分钟前
稚晖君又添一员猛将!
人工智能·算法·程序员
天天扭码4 分钟前
一分钟解决“3.无重复字符的最长字串问题”(最优解)
前端·javascript·算法
风靡晚9 分钟前
一种改进的CFAR算法用于目标检测(解决多目标掩蔽)
人工智能·算法·目标检测·目标跟踪·信息与通信·信号处理
香宝的最强后援XD23 分钟前
区域填充算法
算法
所以遗憾是什么呢?41 分钟前
扩展欧几里得算法【Exgcd】的内容与题目应用
数学·算法·数论·扩展欧几里得·exgcd
haaaaaaarry1 小时前
【贪心】C++ 活动安排问题
开发语言·c++·算法·贪心
ChengZUOZZZ1 小时前
蓝桥杯题目:二维前缀和
java·算法·蓝桥杯
槐月杰5 小时前
C语言中冒泡排序和快速排序的区别
c语言·算法·排序算法