给定一个链表,判断链表是否为回文链表,可以把链表分成两个部分,将第二部分进行反转,然后进行回文比较(注意需要区分链表的个数是奇数还是偶数)
public class HuiWenLianBiao {
public static void main(String[] args) {
ListNode node1 = new ListNode(11);
ListNode node2 = new ListNode(55);
ListNode node3 = new ListNode(56);
ListNode node4 = new ListNode(100);
ListNode node5 = new ListNode(101);
ListNode node6 = new ListNode(100);
ListNode node7 = new ListNode(56);
ListNode node8 = new ListNode(55);
ListNode node9 = new ListNode(111111);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node6;
node6.next=node7;
node7.next=node8;
node8.next=node9;
Solution11 kobe=new Solution11();
boolean res = kobe.method1(node1);
System.out.println(res);
if (res==true)
System.out.println("你输入的链表是回文链表");
else
System.out.println("你输入的不是回文链表");
}
}
class Solution11{
public boolean method1(ListNode node1){
ListNode fast=node1,slow=node1;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
//如果链表是奇数节点 把正中间的节点归到左边去
if (fast!=null) {
slow=slow.next;
}
Solution10 kobe=new Solution10();
slow = kobe.method1(slow);
//method为反转链表的方法 代码也贴在下面了
PringListNode.printListNode123(slow);
fast=node1;
// System.out.println(fast.val!=slow.val);
while (slow != null) {
if (fast.val!=slow.val) {
return false;
}
fast=fast.next;
slow=slow.next;
}
return true;
}
}
反转链表的方法 代码如下
public ListNode method1(ListNode node1){
//这个方法用户对 链表节点 进行反转
ListNode preNode=null;
ListNode curr=node1;
while (curr!=null){
ListNode next=curr.next;
curr.next=preNode;
preNode=curr;
curr=next;
}
return preNode;
}
ListNode工具类自己自己创建 代码如下
public class ListNode {
public int val; //结点值
public ListNode next; //用来指向下一个结点的ListNode对象
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}