链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。
示例1
输入:1,{1,2,3,4,5}
返回值:{5}
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
//利用栈的特性——先入后出
import java.util.Stack;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k==0)
return null;
Stack<ListNode> s=new Stack<>();
while(head!=null)
{
s.push(head);
head=head.next;
}
if(k>s.size())
return null;
while(k-1!=0&&k<=s.size())
{
k--;
s.pop();
}
return s.peek();
}
}
//双指针
//首先定义两个指向链表头的指针p和q,先令p指针指向第k节点,然后两个指针同时向后移动,最后q指向的即为倒数第k个节点。当k为零或节点为空返回。
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k==0)
return null;
ListNode p=head;
ListNode q=head;
while(k-1!=0)
{
p=p.next;
k--;
if(p==null)
return null;
}
while(p.next!=null)
{
q=q.next;
p=p.next;
}
return q;
}
}测试用例
- 功能测试(第k个节点在链表的中间;第k个结点是链表的头节点;第k个节点是链表的尾结点);
- 特殊用例测试(链表头节点为null;链表的节点总数少于k;k等于0)。
链表中环的入口节点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null)
return null;
ListNode p=pHead,q=pHead;
while(q!=null)
{
p=p.next;
q=q.next.next;
if(q==null)
return null;
if(p==q)
break;
}
p=pHead;
while(p!=q)
{
p=p.next;
q=q.next;
}
return q;
}
}测试用例
- 功能测试(链表中包含或者不包含环;链表中有多个或者只有一个节点);
- 特殊输入测试(链表头节点为null)。
反转链表
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入:{1,2,3}
返回值:{3,2,1}
//利用栈的特性
import java.util.Stack;
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null)
return head;
Stack<ListNode> s=new Stack<>();
while(head.next!=null)
{
s.push(head);
head=head.next;
}
ListNode l=head;
while(!s.isEmpty())
{
head.next=s.pop();
head=head.next;
}
head.next=null;
return l;
}
}
//三指针
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null || head.next==null)
return head;
ListNode pre=null,next=null;
while(head!=null)
{
next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}测试用例
- 功能测试(输入的链表中有多个节点;只有一个节点);
- 特殊输入测试(链表头节点为null)。
合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例1
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode res=null;
if(list1==null)
return list2;
if(list2==null)
return list1;
if(list2.val>list1.val)
{
res=list1;
list1.next=Merge(list1.next,list2);
}
else
{
res=list2;
list2.next=Merge(list1,list2.next);
}
return res;
}
}测试用例
- 功能测试(输入的两个链表有多个节点;节点的值互不相同或者存在值相等的多个节点);
- 特殊输入测试(两个链表的一个或者两个头节点为null;两个链表中只有一个节点)。


京公网安备 11010502036488号