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(afterHeadnull){
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(fastslow){
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.datacur.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;
}