1.反转一个单链表
2.给定一个带头结点head的非空单链表,返回链表中的中间结点。如果有两个 中间结点,返回第二个中间结点。
3.输入一个链表,输出该链表中倒数第k个结点
4.将两个有序链表合并成为一个新的有序链表并返回。
5.删除链表中等于给定值val的所有结点
一、反转一个单链表
我们首先来思考一下怎么才能将一个链表反转
最简单的方法就是我们可以利用头插法的思想来进行转换
我们首先创建一个cur使它等于head(头)
同时我们定义一个newHead的链表指向空。
我们通过将遍历cur,同时将newHead指向cur来完成。
代码实现:
public Node reverseList() {
if(this.head==null||this.head.next==null)return head;
Node newHead=null;
Node cur=this.head;
while (cur!=null){
Node curNext=cur.next;
cur.next=newHead;
newHead=cur;
cur=curNext;
}
return newHead;
}
代码运行:
二、给定一个带头结点head的非空单链表,返回链表中的中间结点。如果有两个中间结点,返回第二个中间结点。
这个题目我们可以采用类似于快慢指针的方法来结题
我们通过定义两个链表fast和slow我们让fast走两步然后让slow走一步
就可以实现中间结点的返回,返回slow
代码实现 :
public Node middleNode() {
Node fast=this.head;
Node slow=this.head;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
代码运行:
三、输入一个链表,输出该链表中倒数第k个结点
对于这种题目我们可以采用快慢链表中间相差k-1个的方式遍历。
我们先让fast向前遍历k-1个,就比如说我要找倒是第三个
然后我们在遍历就可以让slow变成倒数第三个
代码实现:
public Node FindKthToTail(int k) {
if(head==null) return null;
if(k<=0){
System.out.println("输入的数字有错误");
return null;
}
Node fast=this.head;
Node slow=this.head;
while(k-1!=0){
if(fast.next!=null){
fast=fast.next;
k--;
}else {
return null;
}
}
while (fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
代码运行:
System.out.println(myLinkedList01.FindKthToTail(3).vel);
四、将两个有序链表合并成为一个新的有序链表并返回。
对于这种题目我们采用定义头结点的方式来创建
我们通过temp将他们中间互相穿插起来然后最后newHead.next为头节点来结题
代码实现:
public Node mergeTwoLists(Node headA, Node headB) {
if(headA==null)return headB;
if(headB==null)return headA;
if(headA == null&&headB == null ) return null;
Node newHead=new Node(-1);
Node temp=newHead;
while(headA!=null&&headB!=null){
if(headA.vel<headB.vel){
temp.next=headA;
headA=headA.next;
}else{
temp.next=headB;
headB=headB.next;
}
temp=temp.next;
}
if(headA==null){
temp.next=headB;
}
if(headB==null){
temp.next=headA;
}
return newHead.next;
}
代码运行:
myLinkedList01.dispaly02(myLinkedList01.mergeTwoLists(myLinkedList01.head,myLinkedList02.head));
五、删除链表中等于给定值val的所有结点
对于这种题我们要采取前后结点,判断前结点是否是对应的值来结题
我们判断cur是否是对应的值是的话将pev.next=cur.next;
代码实现:
public void removeAllvel(int vel){
if(this.head==null) return;
Node pev=this.head;
Node cur=this.head.next;
while(cur!=null){
if(cur.vel==vel){
pev.next=cur.next;
cur=cur.next;
}else{
pev=cur;
cur=cur.next;
}
}
}
代码运行: