(1)输入一个链表,输出该链表中倒数第k个结点。
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution
{
public ListNode FindKthToTail(ListNode head,int k)
{
//这道题的难点在于不知道k结点的位置。怎么办呢
//我们可以使用两个指针,第一个指针先跑k-1 ,然后两个指针再一起跑
//等到第一个指针到终点时,第二个指针距终点也就是倒数第k个结点
ListNode pointer1 = null ,pointer2 =null;
pointer1 = head;//起点为头指针
pointer2 = head; //起点为头指针
//记录k值
int a=k;
//记录节点的个数
int count=0;
//p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑,
//当p指针跑到最后时,pre所指指针就是倒数第k个节点
while(pointer1 != null){
pointer1 = pointer1.next;
count++;
if(k<1) //说明pointer1多跑了k-1步
{
pointer2 = pointer2.next; //此时pointer2可以跑了
}
k--; //pointer1每跑一步,就要讲k减去1
}
//如果节点个数小于所求的倒数第k个节点,则返回空
if(count < a) return null;
return pointer2;
}
}
(2)输入一个链表,反转链表后,输出链表的所有元素。
class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
public class Solution
{
public ListNode ReverseList(ListNode head)
{
if(head==null)
return null;
//head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
ListNode pre = null;
ListNode next = null;
//当前节点是head,pre为当前节点的前一节点,next为当前节点的下一节点
//需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2
//即pre让节点可以反转所指方向,但反转之后如果不用next节点保存next1节点的话,此单链表就此断开了
//所以需要用到pre和next两个节点
//1->2->3->4->5
//1<-2<-3 4->5
while(head!=null){
//做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
//如此就可以做到反转链表的效果
//先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
next = head.next;
//保存完next,就可以让head从指向next变成指向pre了,代码如下
head.next = pre;
//head指向pre后,就继续依次反转下一个节点
//让pre,head,next依次向后移动一个节点,继续下一次的指针反转
pre = head;
head = next;
}
//如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点
//直接输出pre就是我们想要得到的反转后的链表
return pre;
}
}
(3)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
class ListNode
{
int val;
ListNode next = null;
ListNode(int val)
{
this.val = val;
}
}
public class Solution
{
public ListNode Merge(ListNode list1,ListNode list2)
{
ListNode newlist;
if(list1 == null)
return list2;
if(list2 == null)
return list1;
if(list1.val < list2.val)
{
newlist = list1;
newlist.next = Merge(list1.next,list2);
}
else
{
newlist = list2;
newlist.next = Merge(list1,list2.next);
}
return newlist;
}
}