单链表-存储的字符串是否为回文

1. 什么是回文

  1. 回文指正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。

 2. 什么是单链表

  1. 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
  2. 链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。

 3. Java代码实现

  •  判断是否为回文的主方法
public boolean isPalindrome(Node head) {
    if (head == null) return false;
    Node slow = head; //慢指针
    Node fast = head; //快指针
    //如果快指针没有到链表末尾则进入循环
    while (fast.next != null && fast.next.next != null) {
        slow = slow .next;
        fast  = fast .next.next;
    }
    //当循环结束,此时 slow 为中间结点
    //如果fast 的下一个结点为空 则代表此链表为奇数 否则为偶数
    Node leftLink = null;
    Node rightLink = null;
    if (fast.next == null) {
        //奇数个,slow为中间结点
        rightLink = slow.next;
        leftLink = reversal_5(slow).next;
    } else {
        //偶数个,slow为中间结点之一
        rightLink = slow.next;
        leftLink = reversal_5(slow);
    }
    return isEquals(leftLink, rightLink);
}

  •  以指定结点为尾,反转链表
public Node reversal_5(Node p) {

        //三指针法反转链表
//        Node beg = null;
//        Node mid = head;
//        Node end = head.next;
//        while (end != p) {
//            mid.next = beg;
//            beg = mid;
//            mid = end;
//            end = end.next;
//        }
//        mid.next = beg;
//        end.next = mid;
//        mid = end;
//        return mid;

        //头插法
        Node head = this.head;
        Node newHead = null;
        Node tmp = null;
        while (head != p) {
            tmp = head;
            head = head.next;
            tmp.next = newHead;
            newHead = tmp;
        }
        //再赋值的原因:当head==p时未进入循环,少一次赋值
        head.next = newHead;
        newHead = head;
        return newHead;
}

  • 判断两个链表中的值是否相同
public boolean isEquals(Node leftLink, Node rightLink) {
    Node l = leftLink;
    Node r = rightLink;
    boolean flag = true;
    while (l != null && r != null) {
        if (l.data == r.data) {
            l = l.next;
            r = r.next;
            continue;
        } else {
            flag = false;
            break;
        }
    }
    return flag;
}

  •  Node类
public class Node {
    private int data;
    private Node next;

    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }
    public int getData() {
        return data;
    }
}

4. 写在最后

  1. 如果文章内有不正确的地方欢迎大家指正;
  2. 希望和大家一起在编程路上的共同学习、进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值