关于怎么将一个链表分成两个部分,就是用注明的快慢指针的办法,当然快慢指针还有很多的用法。
利用一个快指针pfast和一个慢指针pslow,pslow每次做一次pslow->next,pfast步长为2,做pfast->next->next。利用两个指针的步长不通,当pfast或者pfast->next指向NULL,pslow指向的就是中间的位置。大家可以画几个链表分析一下,slow此时指向的节点,要前一个位置分开才刚刚好,比如4个节点时从pslow断开就不行。所以添加另外一个指针pre指向pslow前一次的位置即可。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
void divideList(ListNode *head){
if(head==NULL||head->next==NULL)return;
ListNode* pslow=head;//慢指针
ListNode* pfast=head; //快指针
ListNode* pre;//记录慢指针位置,为后半部分链表的表头
while(pfast!=NULL&&pfast->next!=NULL){
pre=pslow;
pslow=pslow->next;//慢指针步长为1
pfast=pfast->next->next;//快指针步长为2
}
pre->next=NULL;
}