链表经典面试题(反转链表,中间节点,倒数第k个节点,合并分割链表,删除重复节点)

🎓反转一个单链表。

题目描述
反转很好理解,就是我们生活中所说的颠倒,反转后原来链表的头节点变成尾结点,尾结点变成头节点,链表内容的顺序相反就行了。
题目链接
在这里插入图片描述
基本思路
好理解的双指针(c里面的是指针,java里面是引用变量)

  1. 定义两个指针: pre和 cur ;pre在前 cur在后,pre的初始值为null,用它记录要反转节点的前一个节点的地址,cur里面开始存头节点的地址,指向头节点。
  2. cur之后向后移动遍历整个链表,每次让cur的next指向pre ,实现一次局部反转,局部反转完成之后,pre 和 cur同时往后移动一个位置循环上述过程,直至 pre 到达链表尾部。
    3. 但在cur的next指向pre之前,要定义一个临时变量存储cur后面节点的地址,如果没有提前存储cur后面节点的地址,cur的next指向了pre,cur后面所有的节点都将找不到了。

代码实现:

//声明一个类
class ListNode {
   
   
int val;
ListNode next;
public ListNode(int val) {
   
   
this.val=val;
}
}

class Solution {
   
   
	public ListNode reverseList(ListNode head) {
   
   
		//申请节点,pre和 cur,pre指向null
		ListNode pre = null;
		ListNode cur = head;
		ListNode tmp = null;
		while(cur!=null) {
   
   
			//记录当前节点的下一个节点
			tmp = cur.next;
			//然后将当前节点指向pre
			cur.next = pre;
			//pre和cur节点都前进一位
			pre = cur;
			cur = tmp;
		}
		return pre;
	}
}

动图演示
在这里插入图片描述

🎓返回链表的中间结点

题目描述:
题目很好理解,只是注意下,当链表元素个数为偶数的时候,中间节点有两个,题目说的是返回第二个中间节点,还有有时候可能遇到叫返回第一个节点的情况。
题目连接
在这里插入图片描述
基本思路:
📝比较经典的做法是:快慢指针
首先如果链表没有节点或者只有一个节点,直接返回null,什么都不做。如果有两个以上的节点,使用两个指针变量,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步,一个在前,一个在后,同时走。循环走向去,这样当快指针走完的时候,慢指针就来到了链表的中间位置。这也很好理解就像跑步一样,甲乙两人一起跑步,甲的速度是乙的两倍,当他们走相同的时间的时候,乙走的路程是甲的一半,乙在甲走的路程中点处。
对于循环的条件fast!=null&&fast.next!=null,自己画个偶数,画个奇数的图,就明白了不能单独的是fast.next!=null为判断条件,不然偶数那里会发生空指针异常。

class Solution {
   
   
    public ListNode middleNode(ListNode head) {
   
   
        if(head==null||head.next==null) {
   
   //如果链表为空直接返回null
            return head;
        }
        ListNode fast=head;
        ListNode slow=head;
        while (fast!=null&&fast.next!=null) {
   
   
slow=slow.next;//走一步
fast=fast.next.next;//走两步

        }
        return slow;


    }
}

动图演示:
偶数情况:
在这里插入图片描述
奇数情况:
在这里插入图片描述

🎓输入一个链表,输出该链表中倒数第k个结点

题目描述:
题目连接
在这里插入图片描述
基本思路:
方法一:

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值