目录
〇、快慢指针
快慢指针,是在链表操作中很常用的一种方法。
即定义两个指针指向链表中的节点,一个在前,一个在后。具体是什么意思,如何使用,又为何叫快慢指针呢,先看前两个问题,看完相信就会明白了。
一、取后k个节点
让我们运用快慢指针来解决这个问题:
定义两个指针,其中一个向前走k次,另一个不动。然后两指针一起前行,当先走的指针走到尽头,返回后走指针指向的节点,正好与末尾节点距离为k。问题解决。
public void FromEnd(int k) {
ListNode fastNode = head;
ListNode slowNode = head;
while((fastNode!=null)&& k>=1){
fastNode = fastNode.getNext();
k--;
}
while(fastNode != null) {
fastNode = fastNode.getNext();
slowNode = slowNode.getNext();
}
head = slowNode;
}
二、判断是否成环
链表成环就是说某个节点的next,指向了它前面的节点,形成一个闭环。
定义两个指针,一同向前走,其中一个每次走两步,另一个每次走一步,如果二者相遇,就像在跑道扣圈一样,说明链表成环。
public Boolean Circle(){
ListNode fast = head;
ListNode slow = head;
while ((fast !=null) && (fast.getNext() !=null)){
fast = fast.getNext().getNext();
slow = slow.getNext();
if(fast == slow){
return true;
}
}
return false;
}
三、倒序
代码很简单,过程稍微有一些绕。让我们举例说明。
public ListNode Rever() {
ListNode pre = null;
ListNode next = null;
while(head!=null) {
next = head.getNext();
head.setNext(pre);
pre = head;
head = next;
}
return pre;
}
跟随代码:
next = 0x02 1.next = null pre = 0x01 head = 0x02
next = 0x03 2.next = 0x01 pre = 0x02 head = 0x03
next = null 3.next = 0x02 pre = 0x03 head = null
最后return pre;
pre 的值是 0x03,用以作为倒序后链表的头节点。我们也如愿完成倒序,3指向2,2指向1,1为表尾。
四、有序链表的合并
类似归并排序的合并方式。新建一个链表。分别有一个指针指向开的两个链表的第一个头节点,比较数值大小,升序情况下,将小的节点存入新链表,并将指针后移。而另一个链表的指针不动,继续比较。最后哪个链表还有剩余节点,直接拼接在新链表的后面即可。
public void mergeTwoLists(ListNode n1,ListNode n2){
ListNode tNewNode=new ListNode(0);
ListNode tempNode=tNewNode;
while(n1!=null&& n2!=null) {
if(n1.getVal()<n2.getVal()) {
tempNode.setNext(n1);
n1=n1.getNext();
}else {
tempNode.setNext(n2);
n2=n2.getNext();
}
tempNode=tempNode.getNext();
}
if(n1==null) {
tempNode.setNext(n2);
}
if(n2==null) {
tempNode.setNext(n1);
}
}