LeetCode:删除倒数第n个节点

给定一个链表,删除倒数第n个节点.

Input:1->2->3->4->5,n=2
Output:1->2->3->5

解题思路:
这道题相对比较简单,先循环一次拿到链表的总长度,然后循环到要删除的节点的前一个
节点开始开始删除操作.有一点值得注意的是,删除的节点可能是头节点,要单独处理.

还有一个较为简单的方法,设置两个指针,一个指针距离前一个指针n个距离,同时移动2个指针,
当一个指针移动了终点时,那么前一个指针就是倒数第n个节点了.

Go语言实现


package main

import "fmt"

type liNode struct {
	val int
	Next* liNode
}

func removeNthFromEnd(head *liNode,n int)*liNode{
	fmt.Printf("删除倒数第%d个节点\n",n)
	//var fast,slow *liNode
	slow,fast:=head,head
	for i:=0;i<n;i++{
		fast=fast.Next
	}
	/*除的是头节点*/
	if fast==nil{
		head=head.Next
		return head
	}
	for fast.Next!=nil{
		fast=fast.Next
		slow=slow.Next
	}

	slow.Next=slow.Next.Next
	return head
}

func removeNthFromEnd1(head* liNode,n int)*liNode{
	fmt.Printf("删除倒数第%d个节点\n",n)
	if head==nil{
		return nil
	}
	if n<=0{
		return head
	}
	current:=head
	len:=0
	for current!=nil{
		len++
		current=current.Next
	}
	if n>len{
		return head
	}
	if n==len{
		current:=head
		head=head.Next
		current.Next=nil
		return head
	}
	current=head
	i:=0
	for current!=nil{
		if i==len-n-1{
			deleteNode:=current.Next
			current.Next=current.Next.Next
			deleteNode.Next=nil
			break
		}
		i++
		current=current.Next
	}
	return head
}

func main(){
	//head:=new(liNode)
	node1,node2,node3,node4,node5:=new(liNode),new(liNode),new(liNode),new(liNode),new(liNode)
	node1.val,node2.val,node3.val,node4.val,node5.val=1,2,3,4,5
	//head.Next=node1
	node1.Next=node2
	node2.Next=node3
	node3.Next=node4
	node4.Next=node5
	node5.Next=nil
	res:=removeNthFromEnd(node1,4)
	for res!=nil{
		fmt.Println(res.val)
		res=res.Next
	}

}

C++语言实现 

#include <iostream>
using namespace std;

struct listNode{
    int val;
    listNode* Next;
    listNode(int x):val(x),Next(nullptr){}
}

class Solution{
  listNode* removeNthFromEnd(listNode* head,int n){
      listNode* cur=new listNode(-1);/*定义头结点*/
      cur->Next=head;
      listNode* fast=cur;
      listNode* slow=cur;
      for(auto i=0;i<n;i++){
          fast=fast->Next;
      }
      while(fast->Next){
          fast=fast->Next;
          slow=slow->Next;
      }
      slow->Next=slow->Next->Next;
      return cur->Next;
  }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值