leetcode刷题04--链表划分--T86

2019-05-11  本文已影响0人  KiritoH

题目:


image.png

自己的思路:
两个指针,一个指前:B 一个指后:A 还有一个尾节点:tail,tail_1(记录原来的尾位置,永不变,用来对比)
第一步: 遍历A,每次B保存A前面那个节点,A先找到第一个大于x的节点,将其放到最后面
//A指向的节点放到最后面
tail->next = A;
//把A和前一个节点断开
B->next = A->next;
//A指向节点之后的节点置空(设置为尾节点)
A->next = null;
//更新尾指针
tail = A;
//A恢复到B之后的位置
A = B->next;
第二步: 继续遍历A,遇到大于x的节点重复上面操作,当A遍历到了tail_1的位置,结束

...行不通!
还是参考一下ppt里给的思路吧!


image.png
image.png

其实还是挺容易理解的,用了两个临时链表,一个存大的,一个存小的
最后把小的尾部借上大的的第一个(有值的)节点
就可以了

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        //设置两个临时头结点
        ListNode less_head(0);
        ListNode more_head(0);
        //设置分别指向这两个头结点的指针,注意这里要用'&'符号
        ListNode* less_ptr = &less_head;
        ListNode* more_ptr = &more_head;
        //遍历
        while(head){
            if(head->val >= x){
                //大于
                more_ptr->next = head;
                more_ptr = more_ptr->next;
                
            }else{
                //小于
                less_ptr->next = head;
                less_ptr = less_ptr->next;
            }
            //下一个
            head = head->next;
        }

        
        //链接,此处注意,不是指针类型的节点要用'.'而不是'->'
        less_ptr->next = more_head.next;
        
        //置空
        more_ptr->next = NULL;
        return less_head.next;
        
    }
};

总结:

自己去想还是有难度,
开始想到了一个方案,却在实现过程中发现不可行,花了时间较多.
以后还是要注意一点的,如果10分钟思路不够明朗,就可以看ppt的思路了!
另外在写这个的时候还让自对指针的理解更深了一些

指针只是指向一个节点,却不完全是那个节点,另外'.''->'也有区别,
具体看代码里面

继续加油,剩下的时间看专业课!

上一篇下一篇

猜你喜欢

热点阅读