Leetcode刷题链表之反转链表

本文深入讲解链表反转的三种核心算法:单链表整体反转、指定区间反转及按K个一组翻转。通过实例和代码解析,帮助读者理解并掌握不同场景下的链表操作技巧。

一、反转链表1

1、问题描述

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

2、问题分析

设置采用三个指针,一个指针遍历原链表,一个指针应用于所求链表,最后一个指针是临时指针。
初始化两个指针p1,p2,p1=head;p2=null;
1->null,2->1,3->2…于是问题变成更新这两个指针了。

3、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode p1 = head; 
        ListNode p2 = null;
        ListNode temp;  //临时指针
        while(p1!=null){
            temp = p1.next;  //把p1指向下一位存储起来,用于遍历
            p1.next = p2;  //修改链表指向
            p2 = p1;  //所求链表指针向左移动一位
            p1 = temp;  //同时原链表指针向右移动一位
        }
        return p2;
    }
}

二、反转链表2

1、问题描述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

2、问题分析

可以参照前面的思路,主要是要定位到所需要反转链表的位置
在这里插入图片描述

3、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode temp1;
        ListNode temp2;
        ListNode temp3;
        ListNode pre = new ListNode(0); //创建虚拟节点
        pre.next = head;
        ListNode p1 = pre;
        ListNode p2 = null;
        for(int i=1;i<m;i++){
            p1 = p1.next;
        }
        temp1 = p1;  //标记t1
        p1 = p1.next;
        temp2 = p1; //标记t2
        for(int i=1;i<=n-m+1;i++){ //反转
            temp3 = p1.next;
            p1.next = p2;
            p2 = p1;
            p1 = temp3;
        }
        temp1.next = p2;
        temp2.next = p1; //连接反转后的链表
        return pre.next;
    }
}

三、K 个一组翻转链表

1、问题描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

2、问题分析

在这里插入图片描述

3、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;  
        ListNode tail = dummy;
        while (true) {
            int count = 0;
            while (tail != null && count != k) {  //p1尾部
                count++;
                tail = tail.next;
            }
            if (tail == null) break;
            ListNode temp = pre.next;
            while (pre.next != tail) {  
                ListNode cur = pre.next;
                pre.next = cur.next;
                cur.next = tail.next;
                tail.next = cur;
            }
            pre = temp;
            tail   = temp;
        }
        return dummy.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值