zoukankan      html  css  js  c++  java
  • 读书笔记之《程序员代码面试指南(链表问题)》

    链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

    打印两个有序链表的公共部分

    package LinkedList;
    
    /**
     * Created by zdmein on 2017/8/31.
     *
     * 打印两个有序链表的公共部分
     * 给定两个有序列表的头指针head1和head2,打印两个链表的公共部分。
     */
    public class printCommonPart1 {
        public static class Node{
            public int value;
            public Node next;
            public Node(int data){
                this.value=data;
            }
        }
    
        public static void main(String args[]){
            Node head1=new Node(2);
            Node head11=new Node(3);
            Node head12=new Node(4);
            Node head13=new Node(7);
            head1.next=head11;
            head11.next=head12;
            head12.next=head13;
    
            Node head2=new Node(1);
            Node head21=new Node(3);
            Node head22=new Node(4);
            Node head23=new Node(9);
            head2.next=head21;
            head21.next=head22;
            head22.next=head23;
    
            printCommonPart(head1,head2);
        }
    
        public static void printCommonPart(Node head1,Node head2){
            System.out.println("Print Common Part: ");
            while(head1!=null&&head2!=null){
                if(head1.value==head2.value){
                    System.out.println(head1.value);
                    head1=head1.next;
                    head2=head2.next;
                }else if(head1.value>head2.value){
                    head2=head2.next;
                }else {
                    head1=head1.next;
                }
            }
        }
    }
    

    判断一个链表是否为回文结构

    题目:判断一个链表是否为回文结构。
    要求:时间复杂度为 O(n),空间时间复杂度为O(1)。

    思路分析:回文链表的特点就是对称,那么要判断是否回文,就可以用两个指针指向对称的节点,看它们的数据是否一样。由于是单向链表,不能同时用两个指针,从头尾向内部遍历取值比较。且本题对空间复杂度也有要求,所以可用如下方法实现。
    具体步骤如下:
    (1)先得到链表的中间节点;
    (2)从中间节点的下一个节点开始,反转链表。
    (3)从中间节点处,断开原链表。
    (4)用两个指针分别向两个端点移动,同时进行比较,数据相同则继续,数据不同则直接返回false。直到遍历完成,最后返回true。

    class ListNode {
            public char data;
            public ListNode next;
            public ListNode(char c){
                this.data=c;
            }
        }
        
        public static boolean isPalindrome(ListNode head ){
            ListNode slow = head;
            ListNode fast= head;
            
            if(fast==null || fast.next==null){
                return true;
            }
            //一个每次走2步,一个每次走1步,所以当fast到表尾,slow肯定把链表折半
            while(fast.next!=null&&fast.next.next!=null){
                fast=fast.next.next;
                slow=slow.next;
            }
            
            ListNode midNode=slow;
            ListNode firNode = slow.next; //后半段第一个节点
            ListNode cur=firNode.next; //从第一个节点开始插入
            firNode.next=null; //第一个节点最后变成最后一个节点,所以要置空
            while(cur!=null){
                ListNode nextNode = cur.next;
                cur.next=midNode.next;
                midNode=cur;
                cur=nextNode;
            }
            
            slow=head;
            fast=midNode.next;
            while (fast!=null){
                if(fast.data!=slow.data){
                    return false;
                }
                slow=slow.next;
                fast=firNode.next;
            }
            return true;
        }
    

    反转单向

    反转单向链表

    1-->2-->null

    反转后

    2-->1-->null

    /**
     * Definition for ListNode.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int val) {
     *         this.val = val;
     *         this.next = null;
     *     }
     * }
     */
    
    public class Solution {
        /*
         * @param head: n
         * @return: The new head of reversed linked list.
         */
        public ListNode reverse(ListNode head) {
            // write your code here
            
         ListNode pre=null;
                ListNode next1=null;
                while(head!=null){
                    next1=head.next;
                    head.next=pre;
                    pre=head;
                    head=next1;
                }
                return pre;
        }
    }
    

    Learn ,Practice ,Summary !
  • 相关阅读:
    Jmeter +Maven+jenkins+eclipse 接口自动化测试
    感知机
    第1章 统计学习方法概论
    java jdk安装 以及myeclipse安装
    邻接表
    c语言 文件写入和读取
    c++ string
    线程-run和start
    Transfer learning across two sentiment classes using deep learning
    层次遍历
  • 原文地址:https://www.cnblogs.com/daminzhou/p/8379516.html
Copyright © 2011-2022 走看看