纯c编写,没有递归与调用库,只学了c的可以参考借鉴。
本题思路:先设置一个结点从哨兵位开始进行k的判断如果这个结点能够遍历k遍,则保留该结点(此时该结点的位置为没翻转前第一遍的最后一个结点,在设置一个nxt结点接取这个结点的next(nxt此时为下一段k的第一个元素)),
如果不能遍历k则,直接返回不做改变。
心得:这个代码思路比较容易,但是细节处很多,我调试好久,有一下几个点这次失误:
1.本题之前编写代码有遗漏出,会出现段错误,因为当k=1时,(我之前没有加上这个判断),会导致while内temp一直不为空在那里死循环。
2.在判断if的条件时忘记加上对temp里面NULL的判断导致一直段错误。
如果大家有好的建议和改进的地方欢迎指俺,超级虚心。
struct ListNode* reverseKGroup(struct ListNode* head, int k )
{
    if(head==NULL||head->next==NULL||k==1)
    {
        return head;
    }
    struct ListNode* New=(struct ListNode*)malloc(sizeof(struct ListNode)) ;  //定义一个头节点。
    New->next=head;
    struct ListNode* cur=New->next,*prev=New;   //cur存储反转链表的第一个值,prev存储翻转地域的前一个节点
    struct ListNode* temp=New;   //temp用于记录每次反转前的原链表最后一个值的位置
    while(temp!=NULL)
    {
        int i=0;
        for(i;temp->next!=NULL&&i<k;i++)    //寻找k的区间地址.
        {
            temp=temp->next;
        }
        if(i!=k)
        {
            return New->next;
        }
          struct ListNode* nxt=temp->next;    //记录下一个翻转位置的第一个元素
        while(cur->next!=nxt)    //如果cur的下个节点不是下个翻转位置的首元素则一直翻转。
        {
            struct ListNode*tail=cur->next;
            cur->next=tail->next;
            tail->next=prev->next;
            prev->next=tail;
        }
        prev=cur;
        temp=cur;
        cur=prev->next;
    }
    return New->next;
}