Java链表——取后k个节点、判断是否成环、倒序、有序链表的合并

17 篇文章 0 订阅
4 篇文章 0 订阅

目录

〇、快慢指针

一、取后k个节点

二、判断是否成环

三、倒序

四、有序链表的合并


〇、快慢指针

        快慢指针,是在链表操作中很常用的一种方法。

        即定义两个指针指向链表中的节点,一个在前,一个在后。具体是什么意思,如何使用,又为何叫快慢指针呢,先看前两个问题,看完相信就会明白了。


一、取后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);
		}
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值