链表作为最基本的数据结构,常常出现在笔试和面试题中,今天我们来看看链表的基本操作
关于链表,其实具体的链表的概念就不说了,相信大家都懂,我们直接进入正题。下面的代码是关于单向链表的基本操作(Java实现)
一 链表的创建
public class LinkNode {
public int val;
public LinkNode next;
public void setVal(int val) {
this.val=val;
}
}
二 删除链表的某一个节点
只给出链表中的某一个节点,删除掉它,这里我们可以使用复制删除法,具体就是将被删除节点的下一个节点覆盖掉被删除节点,可能有点绕,直接看例子:
有链表A->B->C,我们要删除掉A节点,那么我们只需要将B复制到A就行了,即A.val=B.val,A.next=B.next,此时就完成了复制。具体代码如下:
public LinkNode remove(LinkNode node) {
node.val=node.next.val;
node.next=node.next.next;
return node;
}
三 链表的反转
给出链表的头节点,实现链表的反转
public LinkNode rev(LinkNode head) {
//用于记录当前节点的上一个节点
LinkNode prep=null;
//用于记录当前节点的下一个节点
LinkNode next=null;
while(head.next!=null) {
next=head.next;
//将当前节点的next指向上一个节点
head.next=prep;
prep=head;
head=next;
}
return head;
}
四 拿到链表的中间节点
public LinkNode getMiddle(LinkNode head) {
if(head==null || head.next==null) {
return head;
}
LinkNode quick=head;
LinkNode slow=head;
while(quick.next.next!=null) {
slow=slow.next;
quick=quick.next.next;
}
return slow;
}
五 判断链表是否为回文链表
public boolean isPalindrome(LinkNode head) {
if(head==null || head.next==null) {
return true;
}
LinkNode middle=getMiddle(head);
LinkNode p=rev(middle.next);
LinkNode q=head;
while(q!=null && p!=null) {
if(p.val!=q.val) {
return false;
}
q=q.next;
p=p.next;
}
return true;
}