题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* reverseKGroup(ListNode* head, int k) {
    	//首先定义一个虚拟头节点
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        //这里相当于使用双指针,一个在前面,一个在后面,来实现两个数的交换
        ListNode* pre = dummyHead;
        ListNode* cur = head;
        int size = 0;
        //获取链表总的节点数,主要用于判断是否在反转区间
        while(cur){
            size++;
            cur = cur->next;
        }
        cur = head;
        //小于等于K时需要反转,大于则不再需要
        for(int i = k; i <= size; i += k){
            int curlen = k;
            //交换一个k区间的节点
            while(--curlen){
                ListNode* temp = cur->next;
                cur->next = temp->next;
                temp->next = pre->next;
                pre->next = temp;
            }
            //更新下一次反转的头节点,因为在上面的反转方法中,一次k区间反转,pre的位置是不变的
            //始终处于头节点,所以在进行写一次k区间反转时,要更新pre的位置。
            pre =  cur;
            cur = cur->next;
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
全部评论

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务