• LeetCode-探索链表-经典问题


    反转链表

    反转一个单链表。

    public class Solution {
        public ListNode ReverseList(ListNode head) {
            //链表为空则返回
            if(head == null) return head;
            ListNode n = head;
            head = null;
            ListNode m = head;
            while (n!= null){
                m = n;//将节点m设为待断开节点
                n = m.next;//将节点n设为待断开节点的后继结点
                m.next = head;//将节点m和链表断开,其后继节点设为反转链表的头引用
                head = m;//将反转链表的头引用更新为m
            }
            return head;
        }
    }
     
    移除链表元素

    删除链表中等于给定值 val 的所有节点。

    public class Solution {
        public ListNode RemoveElements(ListNode head, int val) {
            if(head==null)return null;
            ListNode pre=head,curr=head;
            while(curr!=null){
                //若head为要删除的节点
                if(head.val==val){
                    head=head.next;
                    pre=curr=head;
                    continue;
                }
                //删除节点
                if(curr.val==val){
                    pre.next=curr.next;
                    curr=pre.next;
                }
                //遍历链表
                else{
                    pre=curr;
                    curr=curr.next;
                }
            }
            return head;
        }
    }
    奇偶链表

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。

    请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

    请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

    public class Solution {
        public ListNode OddEvenList(ListNode head) {
            if(head==null)return null;//空链表返回空值
            ListNode p=head,list=p.next,q=list;//list是偶链表的头结点
            while(p.next!=null&&q.next!=null){
                p.next=p.next.next;//奇链表连接奇节点断开偶节点
                q.next=q.next.next;//偶链表连接偶节点断开奇节点
                p=p.next;//奇偶链表指针步进
                q=q.next;
            }
            p.next=list;//奇偶链表合并返回
            return head;
        }
    }
     
    回文链表

    请判断一个链表是否为回文链表。

    public class Solution {
        public bool IsPalindrome(ListNode head) {
            if(head==null)return true;
            ListNode low=head,fast=head,newNode=head,next=null;
            //快慢指针步进,快指针到头后慢指针停留在中间位置或者中间前一位
            while(fast.next!=null&&fast.next.next!=null){
                low=low.next;
                fast=fast.next.next;
            }
            low=ReverseList(low.next);//将后半部分链表反转,然后和前半部分链表比较
            while(low!=null){
                if(low.val!=newNode.val)return false;
                low=low.next;
                newNode=newNode.next;
            }
            return true;
        }
        public ListNode ReverseList(ListNode head) {
            //链表为空则返回
            if(head == null) return head;
            ListNode n = head;
            head = null;
            ListNode m = head;
            while (n!= null){
                m = n;//将节点m设为待断开节点
                n = m.next;//将节点n设为待断开节点的后继结点
                m.next = head;//将节点m和链表断开,其后继节点设为反转链表的头引用
                head = m;//将反转链表的头引用更新为m
            }
            return head;
        }
    }
  • 相关阅读:
    web图片100%宽度自适应,高度不塌陷
    基于Kafka+ELK搭建海量日志平台
    一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等
    MySQL数据库设计规范
    夺命连环问:一个 TCP 连接可以发多少个 HTTP 请求?
    [Kafka]
    ZooKeeper学习总结 第一篇:ZooKeeper快速入门
    Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作
    opencv处理验证码python代码
    mac使用pytesseract
  • 原文地址:https://www.cnblogs.com/errornull/p/10103674.html
Copyright © 2020-2023  润新知