zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    在ubuntu 12.04 x64下编译hadoop2.4
    Learn ZYNQ (9)
    Learn ZYNQ (8)
    Jquery 中 ajaxSubmit使用讲解(转)
    JSON.parse()和JSON.stringify()的区别
    $('div','li'),$('div , li'),$('div li')的区别
    用正则表达式来去除字符的前后空格
    git add 命令添加所有改动内容
    js基础知识
    Web开发学习笔记
  • 原文地址:https://www.cnblogs.com/errortian/p/10103674.html
Copyright © 2011-2022 走看看