链表中倒数第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;两个链表中只有一个节点)。