反转链表&分组翻转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur=head;
        ListNode pre=null;
        while(cur!=null){
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }
}

 

 

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        int cnt=0;
        ListNode cur=head;
        ListNode rehead=null;
//cnt计算一共多少个节点
        while(cur!=null){
            cnt++;
            if(cnt==k){
                rehead=cur;//rehead是翻转完整条链的头结点,就是第一组反转后第一个节点
            }
            cur=cur.next;
        }
        int rest=cnt%k;
//num计算要反转的节点总数
        int num=cnt-rest;
        cnt=0;
//per记录一组里面当前是第几个节点
        int per=0;
         cur=head;
        ListNode pre=null;
//point 记录的是翻转完的一组最后的那个节点,需要和后一组链接起来
//但是注意不是直接链接next节点,要考虑后面是否还有分组
        ListNode point=null;
        while(cnt!=num&&per<=k){
            per++;
            if(per==1){//一组的第一个节点在反转后是最后一个节点
                point=cur;
            }
            cnt++;
            //下面是翻转链表的代码
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
            //这里pointnext是求point后需要连接的节点分情况讨论
            //per==k代表当前组已经翻转完成,即将进入下一组或者最后不需要翻转的元素
            if(per==k&&cnt!=num){//cnt!=num说明后面还有分组,pointnext应该是下一组翻转后第一个元素即翻转前组内最后一个,利用循环next求
                per=0;
                ListNode pointnext=next;
                for (int i = 0; i <k-1 ; i++) {
                    pointnext=pointnext.next;
                }
                point.next=pointnext;
            }else if(per==k &&cnt==num){//后面的元素不需要翻转,直接正常接next
                point.next=next;
            }
        }
        return rehead;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值