1)反转链表
![](https://img.haomeiwen.com/i15203565/5896685a92f24758.jpg)
解答思路如下图示:
![](https://img.haomeiwen.com/i15203565/9968e643c9669428.jpg)
![](https://img.haomeiwen.com/i15203565/bc948a85e7a00f23.jpg)
// 时间复杂度O(n)
// 空间复杂度O(1)
func reverseList(head *ListNode) *ListNode {
var pre *ListNode = nil
cur := head
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
return pre
}
![](https://img.haomeiwen.com/i15203565/28202dd2908fd036.jpg)
提交leetcode,通过
2)删除链表倒数第n个节点
![](https://img.haomeiwen.com/i15203565/e6dfc85cf5f6bc5f.jpg)
一趟扫描的实现方法
思路:定义2个索引p和q,p,q距离相差n+1个节点距离,因为链表最后一个节点是nil,
当q==nil时,p的下一个节点p.Next为要删除的节点
func removeNthFromEnd(head *ListNode, n int) *ListNode {
// 虚拟头结点
dummyHead := &ListNode{Next: head}
p, q := dummyHead, dummyHead
for i := 0; i < n+1; i++ {
q = q.Next
}
for q != nil {
p = p.Next
q = q.Next
}
p.Next = p.Next.Next
return dummyHead.Next
}
![](https://img.haomeiwen.com/i15203565/42a366b83262196a.jpg)
提交leetcode,通过
网友评论