链表——按k个结点一组来反转链表

来源:互联网 发布:桂正和m知乎 编辑:程序博客网 时间:2024/06/05 11:59

题目:按k个结点一组来反转链表


思路:

运用反转链表的通法reverse,对链表进行循环,当计数长度k不时,指针继续前进;当计数长度到达k时,将该组首尾节点first和node作为参数传入翻转函数reverse进行翻转,然后重新拼接到原链表中。直至到达链表末尾。


代码如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {   public ListNode reverseKGroup(ListNode head, int k) {        if(head == null||head.next == null||k<=1)            return head;                ListNode node=head;                ListNode helper=new ListNode(0);//创建一个辅助的头结点;        helper.next=head;//当k> length of list时,返回原链表;        ListNode lastgroup=helper;//记录上一组结点的尾结点;        ListNode nextgroup=head;//辅助记录下一组结点的首结点;        ListNode first=nextgroup;//记录下一组结点的首结点;        int count=1;        while(node!=null)            {            if(count<k)                {                count++;                node=node.next;            }else//count == k;                {                nextgroup=node.next;                lastgroup.next=reverse(first,node);                lastgroup=first;                first.next=nextgroup;                first=nextgroup;                node=first;                                count=1;            }        }        return helper.next;            }    //字符串反转通用方法;    public ListNode reverse(ListNode head,ListNode tail)        {        ListNode pre=head;        ListNode cur=head.next;        ListNode ne=null;        while(pre!=tail)            {            ne=cur.next;            cur.next=pre;            pre=cur;            cur=ne;        }        head.next=null;        head=pre;        return head;    }}


0 0
原创粉丝点击