单链表基础练习(一)
a.判断给定一链表是不是回文结构,是返回true,否则返回false。
例如:1->2->2->3->4->3->2->2->1,返回true
1->2->3->4->3,返回false
解题思路:
判断一个链表是否是回文,主要看他是不是以中间节点为轴左右对称,所以需要找到它的中间结点将其以后节点反转,用一个引用标记他,将他与起始节点即中心节点之前的节点一一比对,完全相同则就是回文结构,任意一对相对的节点不同,则不是回文结构。有了大致思路,就需要实现三个关键函数(找a.中间节点,b.反转一个链表,c.比对判断回文)
具体代码如下:
a.找寻中间节点
先求链表长度,截取长度的一半,保留当前节点位置返回
public static Node middle(Node head){
int len=0;
Node node=head;
Node cur=head;
while (node!=null){
node=node.next;
len++;
}
for (int i=0;i<len/2;i++){
cur=cur.next;
}
if (len%2!=0)
cur=cur.next;
return cur;
}
b.反转一个链表
对于一个不为空的链表,它的头节点为head,定义两个新的引用(a,b)开始置为空,开始一个以head!=null为条件的循环,循环中让其中一个引用a指向head,head向后走一步,新的head指向另一个引用b,引用b又指向引用a指向的对象,直到循环退出,完成链表的反转
Node node=null;
Node cur=null;
while (head!=null){
cur = head;
head = head.next;
cur.next = node;
node = cur;
}
return cur;
c.比对判断回文
令一个新的引用指向反转之后的链表头节点,将其指向对象的值与原链表相对的位置比较,完全相同直到这个引用的next值为空,则return ture,否则return false
if (head!=null){
Node cur=head;
Node node1=null;
Node node2=null;
node1=middle(head);
node2=fanzhuan(node1);
Node c1=head;
Node c2=node2;
while (c2!=null) {
while (c1.val == c2.val) {
if (c2.next == null)
return true;
c1 = c1.next;
c2 = c2.next;
}
return false;
}
}
return false;