关于单链表的应用

1.返回链表的中间节点
我们先定义一个节点从头结点开始,循环遍历链表,定义一个长度为整条链表长度的一半,这样刚好的到最中间的节点。
具体代码实现如下:
在这里插入图片描述
2.输出倒数第K个节点
定义两个节点fast与slow,当K是大于0或者小于长度的,先让fast走k-1步,再当fast.next 不为null,fast走一步,slow走一步,直到fast.next为null时,此时slow所指向的节点就是倒数第K个节点。
public Node findkthNode(int k){
Node fast=this.head;
Node slow=this.head;
if(k<0||k>getLength()){
return null;
}
while(k-1>0){
fast=fast.next;
k–;
}
if(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
3.给定一个数字x,比x小放在前面,大于等于x放在后面,保持原有顺序不变
此时需要将一个链表看成两个部分,前半部分和后半部分,前半部分为比X小的数字,后半部分为大的部分,所以需要定义一个前半部分的头结点、尾节点,后半部分同样,也需要定义一个新的头结点,作为新的链表的头结点。
public Node partition(int x){
Node beforeHead=null;
Node beforeEnd=null;
Node afterHead=null;
Node afterEnd=null;
Node cur=this.head;
while(cur.next!=null){
Node curNext=cur.next;
cur.next=null;
if(cur.data<x){
if(beforeHeadnull){
beforeHead=cur;
beforeEnd=cur;
}else{
beforeEnd.next=cur;
beforeEnd=cur;
}
} else{
if(afterHead
null){
afterHead=cur;
afterEnd=cur;
}else{
afterEnd.next=cur;
afterEnd=cur;
}
}
cur=curNext;
}if(beforeHeadnull){
return afterHead;
}
beforeEnd.next=afterHead;
return beforeHead;
}
4.判断链表中是否有环
链表中有环如图所示:
在这里插入图片描述
判断是否有环,首先需要定义一个环。
在这里插入图片描述
判断是否有环,定义两个节点fast和slow,当fast.next不为空并且fast也不为空时,让fast走两步,slow走一步,当fast与slow相等时,此时就表示链表中是有环的。
在这里插入图片描述
5.判断是否有环,有环返回环开始第一个节点,没有环返回null
这个是建立在有环的基础上的,如果fast=null并且fast.next=null,此时返回null,否则,让fast=head节点,然后当fast!=slow时,fast=fast.next,slow=slow.next。 直到fast=slow时,此时fast和slow所指向的节点就是环的开始节点。
public Node detectCycle(){
Node fast=this.head;
Node slow=this.head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast
slow){
break;
}
}
if(fastnull||fast.nextnull){
return null;
}else{
slow=this.head;
while(slow!=fast){
fast=fast.next;
slow=slow.next;
}
}
return slow;
}
6.排序链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
public Node deleteDuplication(){
Node newHead=new Node(-1);
Node tmpHead=newHead;
Node cur=this.head;
if(cur.next!=null&&cur.datacur.next.data){
while(cur.next!=null&&cur.data
cur.next.data){
cur=cur.next;
}
cur=cur.next;
}else{
newHead.next=cur;
newHead=cur;
cur=cur.next;
}
return tmpHead.next;
}
7.回文结构

public boolean chkPalindrome(){
   if(this.head == null) {
       return false;
   }else if(this.head.next == null) {
       return true;
   }
    Node fast=this.head;
    Node slow=this.head;
    while(fast!=null&&fast.next.next!=null){
        fast=fast.next.next;
        slow=slow.next;
    }
    Node p=slow.next;
    Node pNext=p.next;
    while(p!=null){
        p.next=slow;
        slow=p;
        p=pNext;
        if(p!=null) {
            pNext = p.next;
        }
    }
   while(head != slow) {
       if(head.data != slow.data) {
           return false;
       }
       if(head.next == slow) {
           return true;
       }
       head = head.next;
       slow = slow.next;
   }
   return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值