链表的特殊查找

来源:互联网 发布:linux删除u盘文件 编辑:程序博客网 时间:2024/06/05 07:05

定义链表节点

public class ListNode {    public int val;    public ListNode next;    public ListNode(int x){         val = x;         next = null;    }}

找出单链表中间位置节点

p与q指针同步,q若走不了两步了,p也不要走,因此只判断q是否能走两步即可。

public ListNode FindMidNode(ListNode first){    ListNode p = first, q = first;    while(q!=null && q.next!=null && q.next.next!=null){        q = q.next.next;        p = p.next;    }    return p;}

找到链表中倒数第k个结点,最后一个算作倒1

找到倒数第k个节点
p,q相差k步,等q走到null,p就是在倒数第k个节点上了。
原题来源:leetcode面试题15

public ListNode FindKReverseNode(ListNode first, int k){    ListNode p = first, q = first;    for(int i = 0; q != null && i < k; q = q.next, i++);    while(q != null){        p = p.next;        q = q.next;    }    return p;}

删除链表中倒数第k个结点返回链表头,最后一个算作倒1

注意:
删除与查找的不同在于,查找定位到要查找的节点,但是删除却要定位到要删除的节点的前面的那个节点。
那么如果删除的是头结点和第二个结点该如何区分呢。1->2->null 删除倒数第一个和倒数第二个,如何区分。
保持一个p的前面节点pre,初始为null
最后判断pre是否为null,如果为null就是删除头结点,否则就是删除中间的某个节点(此时不会出现pre.next为空的情况,因为不会出现删除的节点是null的情况)
也就是说关键在于区分删除的是头节点还是第二节点即可
原题来源:leetcode19 Remove Nth Node From End of List

public ListNode RemoveKReverseNode(ListNode first, int k){    ListNode pre = null, p = first, q = first;    int i = 0;    for(;q != null && i < k; q = q.next,i++);    if(i < k) return null;//当给出的k不得当,大于链表长度    while(q != null){        q = q.next;        p = p.next;    }    if(pre == null) first= first.next;    else pre.next = pre.next.next;    return first;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 移动卡流量超了怎么办 狗狗老是挠痒痒怎么办 出差同住的同事睡觉打鼾怎么办 小孩皮肤太黑了怎么办 苹果平板突然黑屏打不开怎么办 孩子认人晚上哭怎么办 主腹动脉有硬块怎么办 糖链抗原125偏高怎么办 狗长了个肿瘤怎么办 腺肌瘤糖类抗原125升高怎么办 糖类抗原724单项升高怎么办? 化疗期间糖类抗原升高怎么办? 门面租客到期不搬怎么办 这几天老想初恋怎么办 结婚了还想初恋怎么办 九年了想初恋了怎么办 吃肥肉恶心想吐怎么办 宝宝吃了母乳不吃奶粉怎么办 母猫的奶少怎么办 鲤鱼打挺起不来怎么办 练不会鲤鱼打挺怎么办 鲤鱼打挺脖子痛怎么办 新买的沙发太高怎么办 额最后离开公司没人关灯怎么办 看到我妹妹就烦怎么办 野塘钓鱼不开口怎么办 团关系找不到接收地怎么办 两岁宝宝就是不肯说话怎么办 两岁宝宝不肯吃药怎么办 并蹄莲叶子大黄怎么办 异地恋见面来大姨妈怎么办 奶水太多宝宝老是呛到怎么办 奶水太多吃奶婴儿呛怎么办 人家不愿意交我为朋友怎么办 面对诋毁我的人怎么办 做事太细致速度太慢怎么办 高一儿子早恋了怎么办 儿子18岁谈朋友怎么办 和朋友为钱吵架怎么办 感情里总担心失去怎么办 眼石移出盲僧怎么办