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;
    }
}

 

posted @ 2018-12-11 17:36  田错  阅读(358)  评论(0编辑  收藏  举报