纯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;
}